Existe polimorfismo sem herança

[quote=luistiagos]bem então neste exemplo:


interface A {
  final static int x = 4;
}

a classe que implementar esta interface tera herdado a constante x…

dai neste ponto o argumento:
Mas que B implementa o contrato definido por A…
neste ponto B não ira implementar nenhum contrato definido por A ele ira herdar a constante de A…

[/quote]

Não é a toa que isso é considerado um anti-pattern. Aliás, um anti-pattern tão feio que é citado em especial no Effective Java.
E, novamente, você está pegando aspectos de uma implementação de uma linguagem, para tentar justificar um conceito. A linguagem Java permite esse tipo de aberração, que nada tem a ver com o conceito de interface.

A interface nada mais é do que um contrato entre duas classes. Nada mais. Esse é o conceito. E é exatamente por ser somente isso que elas são tão úteis.

Esse pode ser implementado de várias formas nas linguagens:

  1. No C++: Classes abstratas, só com métodos virtuais puros e através de extensão pública ou implicitamente em templates;
  2. No Java: Existe uma construção nativa para dar suporte ao conceito, chamada interface;
  3. No Groovy e Ruby: implicitamente em runtime, através de duck typing.

O C++ não tem um mecanismo nativo para a implementação do conceito de interfaces. Mas existem interfaces sim, pois há formas de utilizar esse conceito:

  1. Criar classes abstratas, sem propriedades, com um construtor vazio e só com métodos virtuais puros. Como a linguagem não dá suporte nativo, não há avisos para o programador caso ele venha a ferir essas regras, mas isso não significa que isso deixou de ser um erro de projeto. Herança múltipla nesse tipo de classe não está sujeita aos problemas do Diamond of Death e, do ponto de vista do projeto, passam a representar uma relação de contrato e não de tipos. Efetivamente, ao usar dessa forma, você deixou de fazer herança para usar interfaces;
  2. Usar templates e interfaces implícitas.

O que eu já ressaltei algumas vezes, e parece ser o que você está confundindo, é que o conceito é uma coisa, enquanto o mecanismo que implementa esse conceito é outra totalmente diferente. No C++, o mecanismo que se usa para criar uma interface e uma classe base é exatamente o mesmo. Porém, você só terá a interface caso siga certas regras, que a tornam útil.

[quote=king_of_gods]O que vcs estão batendo cabeça é:

POLIMORFISMO - é uma coisa, SOBRECARGA é outra coisa, SOMBREAMENTO é outra coisa ainda. Todos são tipos de construção de métodos na Orientação a Objeto.

Herança não é funcionalidade da linguagem, herança é uma caracteristica que qualquer linguagem orientada a objeto tem que permitir.

Orientação a Objeto não é dá linguagem JAVA , é um conceito q o JAVA utiliza. Lembre-se disso.[/quote]

Não existe nenhuma definição formal do que é necessário para uma linguagem ser orientada a objeto. Não há a obrigatoriedade de herança para uma linguagem ser OO. Javascript é um exemplo de linguagem que não possui herança, não possui definição de classe, mas é orientada a objetos.

Com relação a poliformismo, já pensou que sobrecarga é um tipo de polimorfismo?

[quote=king_of_gods][quote=sergiotaborda][quote=king_of_gods]
Volto a repetir não existe polimorfismo sem herança.[/quote]

Tudo bem. Então sombreamento, sobecarga, tipos genericos , auto-boxing são tudo tipos de quê ? “funcionalidades da linguagem” ?
Ok. Mas nesse caso herança tb é apenas uma “funcionalidade da linguagem”. Assim não vamos a lado nenhum… [/quote]

O que vcs estão batendo cabeça é:

POLIMORFISMO - é uma coisa, SOBRECARGA é outra coisa, SOMBREAMENTO é outra coisa ainda. Todos são tipos de construção de métodos na Orientação a Objeto.
[/quote]

Ora aí e´que está.
Sobrecarga e Sombreamento são ambos tipos de Polimorfismo.
(sombreamento não é uma forma de construção de métodos , logo por ai a sua afirmação é falsa.)

Engraçado, porque Polimorfismo tb não é uma funcionalidade da linguagem.

Polimorfismo também. Lembre-se disso…

Na real :

  1. Polimorifsmo é um conceito não associado a herança e sim a escopo.
    1.1.) Herança tb é um conceito associado a escopo. Daqui se entende que Polimorfismo => Escopo <= Herança. Ou seja,
    Se tem herança, então deve existir algum polimorfismo associado.
    1.1.1) O polimorfismo associado a herança é a Variável Polimorfica.

  2. Existem vários escopos em Java
    2.1) portanto, algum polimorfismo deve estar associado a eles.
    2.1.1) Está, é o sombreamento.

Algumas linguagens não implementam sombreamento. Ok. neste caso o polimorfismo não está implementado. Mas isso não significa que ele não existe.

Veja de outra forma: duck typing comum em linguagens de script é uma forma de polimorfismo. é a “variável super-polimorfica” por assim dizer. Java não tem isso, mas isso não significa que não é uma forma de polimorfismo.

“Superficialmente, polimorfismo é a habilidade de duas classes diferentes de terem cada uma delas uma operação que tenha a mesma assinatura, tendo o mesmo tempo duas formas muito diferentes de código de método para a operação.”

Exemplo de polimorfismo SEM HERANÇA:

public interface Falante {
    public void falar();
}

public class Cachorro implements Falante {
    public void falar() {
        System.out.println("au au");
    }
}

public class Gato implements Falante {
    public void falar() {
        System.out.println("miau");
    }
}

public class Programa {
    private static Falante getFalante() {
        return (new java.util.Date().getTime() / 1000 % 2 == 0) ? new Gato() : new Cachorro();
    }

    public static void main(String[] args) {
        Falante f = getFalante();
        f.falar(); // Se for um gato, vai falar "miau". Se for um cachorro, fala "au au".
    }
}

O conceito de polimorfismo está aí. A implementação variou de acordo com o tipo real da variável. E não há herança.

Polimorfsimo em geral:

Paper de 1985: http://research.microsoft.com/Users/luca/Papers/OnUnderstanding.pdf

Resumindo: existem tipos polimórficos e funções polimórficas. Sobrecarga caracteriza polimorfismo e pode ser encontrado mesmo em linguagens extremamente monomórficas.

A propósito: polimorfismo é um conceito usado em Orientação a Objetos, não da Orientação a Objetos. E OO não precisa de classes, logo não de herança como estamos discutindo aqui.

Resumindo: se você for fazer um concurso público, eles vão cobrar um conceito de polimorfismo que é bem quadradinho (provavelmente o gabarito vai lhe declarar que é necessário ter a tal da herança).

Mas se você souber a teoria e a prática corretamente, como o Shoes, vai descobrir que o conceito de polimorfismo não está relacionado ao conceito de herança.

E por favor - todo dia nasce gente que troca as letras e diz “poliformismo”. É só lembrar que a grafia errada rima com “transformismo” (acho que você deve saber o que é um transformista, não?) e “conformismo” para saber que a grafia certa é “polimorfismo”, que é uma coisa completamente não relacionada a essas coisas.

[quote=pcalcado]Polimorfsimo em geral:

Paper de 1985: http://research.microsoft.com/Users/luca/Papers/OnUnderstanding.pdf

Resumindo: existem tipos polimórficos e funções polimórficas. Sobrecarga caracteriza polimorfismo e pode ser encontrado mesmo em linguagens extremamente monomórficas.

A propósito: polimorfismo é um conceito usado em Orientação a Objetos, não da Orientação a Objetos. E OO não precisa de classes, logo não de herança como estamos discutindo aqui.[/quote]

Discordo de vc. Segundo eu conversei hj com alguns professores, eles me falaram algo muito interessante:

Existem dois tipos de ligação a Estática e a Dinâmica.

Ligação Estática -> é aquilo que é definido em tempo de compilação. (EX: Item x = new Item()).

Sobrecarga é o conceito q se encaixa em ligação estática, vc consegue detectar em tempo de execução que há um método sobrecarregado.

Ligação Dinâmica -> aquilo que é definido em tempo de execução. Ex: (if(chave) return new Gato(); else return new Cachorro():wink:

Polimorfismo entra no conceito de ligação dinâmica é aquilo que só é definido em tempo de execução, e pra existência do polimorfismo é sim necessária a existência de herança. Polimorfismo é um tipo de sobreposição de método.

Orientação Objeto se baseia em 3 coisas: Classes, Objetos e Herança, se ferir uma destas três não é considerada uma linguagem orienta há objeto.

Uma coisa que gostaria de ressaltar aqui: Há várias literaturas que falam de polimorfismo como citado no post do nosso amigo pcalcado . Os conhecedores há fundo de OO não usam estes livros pois consideram um livro mto genérico pra uma coisa que não tem nada haver com polimorfismo.

Um livro que qlq um pegar e vai matar a charada é o Livro do Jackbson de 1997 que ele fala de Polimorfismo, peguem, leiam e deem a sua opinião.

Vale ressaltar que interface é uma "casca" e não uma classe.

Só para reforçar o q eu falei, sobre o que é fundamental ter em uma linguagem orientada a Objeto, veja o tutorial da sun: http://java.sun.com/docs/books/tutorial/java/concepts/index.html

Oi,

Se seus professores discordam de Luca Cardelli (que eh um dos maiores pesquisadores da area) seria interessante voce linkar para algum trabalho que eles tenham publicado para que entendamos porque da discordancia. Preferencialmente alguma literatura que confirme com alguma base que polimorfismo soh se atinge em runtime (ligacao dinamica eh outra historia paralela a esta).

Favor linkar para uma referencia credivel. Orientacao a Objetos nao exige classes ou heranca. Uma boa referencia, em linguagem acessivel, sobre o tema: http://portal.acm.org/citation.cfm?id=324493.324538

Eu realmente sugiro que voce conheca mais sobre Luca Cardelli antes de falar algo deste tipo. Foi ele quem definiu boa parte do que sabemos sobre tipos em linguagens de programacao.

http://lucacardelli.name/

Este eh um tutorial basico sobre como java implementa OO (com classes, passagem de mensagens, etc.). Nao confundir com definicao de OO.

É esse “militarismo” que mata nas faculdades.Isso é uma especificação genérica sobre OO.E o fato de possuir essas especificações, não significa que você tenha que usar todas elas, como muito já foi dito, muitas vezes, é melhor usar Composição ao invés de Herança, e não me gosta que Java será “menos” OO por isso. :wink:

Eu queria saber quem tornou necessário associar o polimorfismo a uma ligação dinâmica?
Novamente, isso é a confusão da forma de se implementar o conceito, com o conceito em si.

É? E que tal isso aqui?
http://www.chips.navy.mil/archives/99_oct/polymorphism.htm

[quote=king_of_gods]Discordo de vc. Segundo eu conversei hj com alguns professores, eles me falaram algo muito interessante:

Existem dois tipos de ligação a Estática e a Dinâmica.

Ligação Estática -> é aquilo que é definido em tempo de compilação. (EX: Item x = new Item()).

Sobrecarga é o conceito q se encaixa em ligação estática, vc consegue detectar em tempo de execução que há um método sobrecarregado.

Ligação Dinâmica -> aquilo que é definido em tempo de execução. Ex: (if(chave) return new Gato(); else return new Cachorro();)[/quote]

O que tem a ver ligação, que varia de linguagem para linguagem, com a discussão sobre polimorfismo?

Só em tempo de execução? Então, por que uma busca no google para [google]static polymorphism[/google] retorna um mooonte de páginas (a maioria relacionado a templates do C++)?

É mesmo? Então por que uma busca no google para [google]javascript oo[/google] retorna um monte de páginas (muito mais que static polymorphism), mesmo que essa linguagem não tenha a palavra-chave class funcional?

[quote=king_of_gods]Uma coisa que gostaria de ressaltar aqui: Há várias literaturas que falam de polimorfismo como citado no post do nosso amigo pcalcado . Os conhecedores há fundo de OO não usam estes livros pois consideram um livro mto genérico pra uma coisa que não tem nada haver com polimorfismo.

Um livro que qlq um pegar e vai matar a charada é o Livro do Jackbson de 1997 que ele fala de Polimorfismo, peguem, leiam e deem a sua opinião.

Vale ressaltar que interface é uma "casca" e não uma classe.
[/quote]

Quem são esses conhecedores?
E quem disse que o artigo citado pelo Shoes não fala de polimorfismo?

[[quote=pcalcado]Oi,

Se seus professores discordam de Luca Cardelli (que eh um dos maiores pesquisadores da area) seria interessante voce linkar para algum trabalho que eles tenham publicado para que entendamos porque da discordancia. Preferencialmente alguma literatura que confirme com alguma base que polimorfismo soh se atinge em runtime (ligacao dinamica eh outra historia paralela a esta).

[/quote]

Vou linkar a um trabalho, vou pedir pra eles onde foi publicado e passo aqui o link.

Dito acima.

Tá cara ele definiu, mas quem realmente pode nós orientar a isso é quem criou né?

É esse “militarismo” que mata nas faculdades.Isso é uma especificação genérica sobre OO.E o fato de possuir essas especificações, não significa que você tenha que usar todas elas, como muito já foi dito, muitas vezes, é melhor usar Composição ao invés de Herança, e não me gosta que Java será “menos” OO por isso. :wink:
[/quote]

Amigo você não entendeu, o que eu quiz dizer é que para uma LINGUAGEM ser OO tem que ter os três conceitos. Se você no seu programa usa ou não, não é o problema, é que ela tem q suportar os três conceitos.

Pior que isto é uma verdade… a maioria aqui sabe que existe outras maneiras de se aplicar polimorfismo que não seja atravez de herança… porem se uma questão destas cai em um concurso publico provavelmente estara assosiado com herança… caso aquele que elaborou a prova for um destes professores de faculdade multimaterias que não entende bulhufas daquilo que ensina… dai é foda…

[quote=Leonardo3001][quote=king_of_gods]Discordo de vc. Segundo eu conversei hj com alguns professores, eles me falaram algo muito interessante:

Existem dois tipos de ligação a Estática e a Dinâmica.

Ligação Estática -> é aquilo que é definido em tempo de compilação. (EX: Item x = new Item()).

Sobrecarga é o conceito q se encaixa em ligação estática, vc consegue detectar em tempo de execução que há um método sobrecarregado.

Ligação Dinâmica -> aquilo que é definido em tempo de execução. Ex: (if(chave) return new Gato(); else return new Cachorro();)[/quote]

O que tem a ver ligação, que varia de linguagem para linguagem, com a discussão sobre polimorfismo?

Só em tempo de execução? Então, por que uma busca no google para [google]static polymorphism[/google] retorna um mooonte de páginas (a maioria relacionado a templates do C++)?

É mesmo? Então por que uma busca no google para [google]javascript oo[/google] retorna um monte de páginas (muito mais que static polymorphism), mesmo que essa linguagem não tenha a palavra-chave class funcional?

[quote=king_of_gods]Uma coisa que gostaria de ressaltar aqui: Há várias literaturas que falam de polimorfismo como citado no post do nosso amigo pcalcado . Os conhecedores há fundo de OO não usam estes livros pois consideram um livro mto genérico pra uma coisa que não tem nada haver com polimorfismo.

Um livro que qlq um pegar e vai matar a charada é o Livro do Jackbson de 1997 que ele fala de Polimorfismo, peguem, leiam e deem a sua opinião.

Vale ressaltar que interface é uma "casca" e não uma classe.
[/quote]

Quem são esses conhecedores?
E quem disse que o artigo citado pelo Shoes não fala de polimorfismo?[/quote]

Eu não disse que não fala de polimorfismo disse que o conceito falando ali está equivocado.
Amigo, JavaScript não é orientada a objeto, nas últimas versões passou a suportar orientação a objeto.

Cara, baseado em que vc afirma que “JavaScript não é orientada a objeto, nas últimas versões passou a suportar orientação a objeto”?
PS: Depois de algum tempo fora da faculdade vc irá perceber que muitos de seus professores estavam equivocados.

Ok, quando você apresentar algo, qualquer coisa, a gente discute.

Errr… você pode (1)dizer qual a diferença e (2) dizer (com referências, claro) quem criou?

[/quote]
Amigo você não entendeu, o que eu quiz dizer é que para uma LINGUAGEM ser OO tem que ter os três conceitos. Se você no seu programa usa ou não, não é o problema, é que ela tem q suportar os três conceitos.[/quote]

Ele entendeu. Você que não citou nada para dar base a sua afirmação.

[quote=king_of_gods]
Eu não disse que não fala de polimorfismo disse que o conceito falando ali está equivocado.
Amigo, JavaScript não é orientada a objeto, nas últimas versões passou a suportar orientação a objeto.[/quote]

As últimas versões de javaScript que eu conheço foram lançada em 1999 e 2001. De que nova versão você está falando?