Jump to content
Rodrigo Graça

Polimorfismo??

Recommended Posts

Rodrigo Graça

Boas.

Eu ando a estudar Visual Basic .NET e o meu professor à uns dias esteve a dar classes e falou de polimorfismo que pelo que percebi era os metodos de uma classe se comportarem de maneira diferente em casos diferentes.

Então eu gostava de saber como faço uma classe que consiga calcular a área de varias figuras geométricas. Ou seja que tenha um metodo chamado area() que calcule a area. E depois conforme se for a area de um quadrado ou de um triangulo ela retorne o valor corecto. Por outras palavras eu passaria os valores á classe e ela devolvia a área independente de qual a figura geometrica visto que pelo que sei o polimorfismo dá para isso, para se comportar diferente de quando é o quadrado ou de quando é o triangulo.

Como faço isso???

Share this post


Link to post
Share on other sites
jviana

Podes usar o:

If a = a Then'Se a for igual a A então
msg("a") 'Isto
Else 'Senão
msgbox("b") ' isto

Cumps. J.Viana


Learning

  • VB.Net
  • HTML
  • C/C++

Share this post


Link to post
Share on other sites
AMateus

Podes usar o:

If a = a Then'Se a for igual a A então
msg("a") 'Isto
Else 'Senão
msgbox("b") ' isto

Cumps. J.Viana

😲

Isto não têm nada a ver com polimorfismo!

Polimorfismo é a capacidade de a mesma função executar código diferente, consoante a maneira como é usada, usando inheritance, overloading e overriding.

Exemplo de runtime polimorfismo (tirada algures da net):

Class parent
{
virtual void hello()
{ Console.WriteLine(“Hello from Parent”); }
}

Class child : parent
{
override void hello()
{ Console.WriteLine(“Hello from Child”); }
}

static void main()
{
parent objParent = new child();
objParent.hello();
}
//Output
Hello from Child.

Depois tens outros tipos de polimorfismo, com o overloading, em que existem várias funções com o mesmo nome, mas cada uma com número de parametros diferentes.


R. Tape Loading Error

Share this post


Link to post
Share on other sites
ribeiro55

Ò Viana, sinceramente.

Vai no mínimo ao google.

Não sei quantos tipos de polimorfismo existem, mas conheço pelo menos dois:

Mesmo nome de método, assinaturas diferentes (overloading):

Public Class FormaGeometrica

    Public Overloads Shared Function Area(ByVal Raio As Double) As Double
        Return Math.PI * Raio ^ 2
    End Function

    Public Overloads Shared Function Area(ByVal Aresta1 As Double, ByVal Aresta2 As Double) As Double
        Return Aresta1 * Aresta2
    End Function

    Public Overloads Shared Function Perimetro(ByVal Raio As Double) As Double
        Return 2 * Math.PI * Raio
    End Function

    Public Overloads Shared Function Perimetro(ByVal Aresta1 As Double, ByVal Aresta2 As Double) As Double
        Return (Aresta1 * 2) + (Aresta2 * 2)
    End Function

End Class

Que podes testar com:

        MsgBox( _
        "Área círculo: " & FormaGeometrica.Area(4) & vbCrLf & _
        "Perímetro círculo: " & FormaGeometrica.Perimetro(4) & vbCrLf & _
        "Área rectângulo: " & FormaGeometrica.Area(5, 10) & vbCrLf & _
        "Perímetro rectângulo: " & FormaGeometrica.Perimetro(5, 10))

Assinatura igual, implementação diferente (overriding).

O que fiz aqui, basicamente, foi agarrar num objecto abstracto (FormaGeometrica) que tem dois métodos.

Estes métodos são "overrided" por os métodos de mesma assinatura que constam em cada um dos objectos (Area e Perimetro) que herdam do abstracto, cada um com a sua implementação. (O MustOverride faz com que seja obrigatório implementar estes métodos nos herdeiros)

Não serve para muito aqui, pois o objecto base não faz mais nada, mas para entenderes é óptimo.

Agarrando no que precisas, exemplificando com 3 formas geométricas:

Public MustInherit Class FormaGeometrica
    Public MustOverride Function Perimetro() As Double
    Public MustOverride Function Area() As Double
End Class

Public Class Quadrado
    Inherits FormaGeometrica
    Private _Aresta As Double

    Sub New(ByVal Aresta As Double)
        _Aresta = Aresta
    End Sub

    Public Overrides Function Area() As Double
        Return _Aresta ^ 2
    End Function

    Public Overrides Function Perimetro() As Double
        Return (4 * _Aresta)
    End Function

End Class

Public Class Rectangulo
    Inherits FormaGeometrica
    Private _Aresta1, _Aresta2 As Double

    Sub New(ByVal Aresta1 As Double, ByVal Aresta2 As Double)
        _Aresta1 = Aresta1
        _Aresta2 = Aresta2
    End Sub

    Public Overrides Function Area() As Double
        Return _Aresta1 * _Aresta2
    End Function

    Public Overrides Function Perimetro() As Double
        Return (2 * _Aresta1) + (2 * _Aresta2)
    End Function

End Class

Public Class Circulo
    Inherits FormaGeometrica
    Private _Raio As Double

    Sub New(ByVal Raio As Double)
        _Raio = Raio
    End Sub

    Public Overrides Function Area() As Double
        Return Math.PI * _Raio ^ 2
    End Function

    Public Overrides Function Perimetro() As Double
        Return 2 * Math.PI * _Raio
    End Function
End Class

Que podes testar com:

        Dim FormaCirculo As New Circulo(4)
        Dim FormaQuadrado As New Quadrado(5)
        Dim FormaRectangulo As New Rectangulo(5, 10)

        MsgBox( _
        "Área círculo: " & FormaCirculo.Area & vbCrLf & _
        "Perímetro círculo: " & FormaCirculo.Perimetro & vbCrLf & _
        "Área quadrado: " & FormaQuadrado.Area & vbCrLf & _
        "Perímetro quadrado: " & FormaQuadrado.Perimetro & vbCrLf & _
        "Área rectângulo: " & FormaRectangulo.Area & vbCrLf & _
        "Perímetro rectângulo: " & FormaRectangulo.Perimetro)

EDIT: 10 minutes late!  :)


Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Share this post


Link to post
Share on other sites
Rechousa

Boas.

Eu ando a estudar Visual Basic .NET e o meu professor à uns dias esteve a dar classes e falou de polimorfismo que pelo que percebi era os metodos de uma classe se comportarem de maneira diferente em casos diferentes.

Então eu gostava de saber como faço uma classe que consiga calcular a área de varias figuras geométricas. Ou seja que tenha um metodo chamado area() que calcule a area. E depois conforme se for a area de um quadrado ou de um triangulo ela retorne o valor corecto. Por outras palavras eu passaria os valores á classe e ela devolvia a área independente de qual a figura geometrica visto que pelo que sei o polimorfismo dá para isso, para se comportar diferente de quando é o quadrado ou de quando é o triangulo.

Como faço isso???

Bom dia,

http://pt.wikipedia.org/wiki/Polimorfismo


Pedro Martins

Sharing is Knowledge!

http://www.linkedin.com/in/rechousa

Share this post


Link to post
Share on other sites
Rodrigo Graça

@AMateus Ainda fiquei mais confuso XD

@ribeiro55 agora já fiquei esclarecido. o tipo overloading esclareceu-me porque o outro complica para mim.

@Rechousa google e wikipedia são os meus primeiros recursos. e inclusive foi por la ir ler que eu fiquei sem perceber isto do polimorfismo.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.