Delphi, Smalltalk, Java, C++? Qual destas não é OO?

Nunca tentei fazer o que vou falar, mas talvez você possa implementar IInterface diretamente e implementar os métodos delegando para TInterfacedObject realizar a tarefa.

[quote=marciosantri]Chun, vc que é um cara tão fera pelo que vejo nas suas mensagens, implicando com uma questão tão insignificante. Isto nunca me atrapalhou a programar OO no Delphi. Eu hein…

Inté.[/quote]

A questão não é ser insignificante…

Queimar a UNICA HERANCA POSSIVEL em seu sistema…assim… diretamente… é uam questão bem relevante no design de um sistema OO.

[quote=chun]Outra coisa que não encaixa…

O que uma INSTANCIA DE UMA CLASSE tem a ver com uma INTERFACE ?

A interface eh apenas um CONTRATO… nada mais…[/quote]

polimorfismo.

[quote=juliocbq][quote=chun]Outra coisa que não encaixa…

O que uma INSTANCIA DE UMA CLASSE tem a ver com uma INTERFACE ?

A interface eh apenas um CONTRATO… nada mais…[/quote]

polimorfismo.[/quote]

O polimorfismo nada tem a ver com a instancia da classe… e sim com a classe…

Não existe “intancia de interface”…
nao tem prq se preocupar com “GC” para isso…

[quote=chun][quote=juliocbq][quote=chun]Outra coisa que não encaixa…

O que uma INSTANCIA DE UMA CLASSE tem a ver com uma INTERFACE ?

A interface eh apenas um CONTRATO… nada mais…[/quote]

polimorfismo.[/quote]

O polimorfismo nada tem a ver com a instancia da classe… e sim com a classe…

Não existe “intancia de interface”…
nao tem prq se preocupar com “GC” para isso…
[/quote]
lembrando que em c++ não se usa interfaces, e sim, classes abstratas.
Exemplos de polimorfismo e interfaces.

http://g.oswego.edu/dl/mood/C++AsIDL.html
http://www2.unoeste.br/~aglae/ling_pro/c_exemplos.htm

[quote=juliocbq][quote=chun][quote=juliocbq][quote=chun]Outra coisa que não encaixa…

O que uma INSTANCIA DE UMA CLASSE tem a ver com uma INTERFACE ?

A interface eh apenas um CONTRATO… nada mais…[/quote]

polimorfismo.[/quote]

O polimorfismo nada tem a ver com a instancia da classe… e sim com a classe…

Não existe “intancia de interface”…
nao tem prq se preocupar com “GC” para isso…
[/quote]
lembrando que em c++ não se usa interfaces, e sim, classes abstratas.
Exemplos de polimorfismo e interfaces.

http://g.oswego.edu/dl/mood/C++AsIDL.html
http://www2.unoeste.br/~aglae/ling_pro/c_exemplos.htm[/quote]

Algum motivo para não usar interfaces em C++ ?

Classes absteratas não tem a mesmo intuito de uma interface…
São coisas bem diferentes.

[quote=chun][quote=juliocbq][quote=chun][quote=juliocbq][quote=chun]Outra coisa que não encaixa…

O que uma INSTANCIA DE UMA CLASSE tem a ver com uma INTERFACE ?

A interface eh apenas um CONTRATO… nada mais…[/quote]

polimorfismo.[/quote]

O polimorfismo nada tem a ver com a instancia da classe… e sim com a classe…

Não existe “intancia de interface”…
nao tem prq se preocupar com “GC” para isso…
[/quote]
lembrando que em c++ não se usa interfaces, e sim, classes abstratas.
Exemplos de polimorfismo e interfaces.

http://g.oswego.edu/dl/mood/C++AsIDL.html
http://www2.unoeste.br/~aglae/ling_pro/c_exemplos.htm[/quote]

Algum motivo para não usar interfaces em C++ ?

Classes absteratas não tem a mesmo intuito de uma interface…
São coisas bem diferentes.
[/quote]

não são não. O conceito interface veio com java.
c++ implementava essa idéia anos antes.

A palavra chave interface veio para suprir problemas causados pela herança múltipla, possivel em c++(aliás, que é uma ferramenta muito boa, se usada com bom senso)

Meu deus…
estou em estado de choque…

Interfaces são CONTRATOS e não IMPLEMENTAÇÔES…

Sim… com elas vc pode dar um “migué” e tentar algo como herança multipla…

[code]type
TClassePai = class(TInterfacedObject) // Ao invés de herdar de TObject, herdar de TInterfacedObject


end;

TClasseFilha = class(TClassePai, IInterface)


end;[/code]

Qual o problema nisso?

[quote=chun]Meu deus…
estou em estado de choque…

Interfaces são CONTRATOS e não IMPLEMENTAÇÔES…

Sim… com elas vc pode dar um “migué” e tentar algo como herança multipla…

[/quote]

ai meu deus. Dá uma olhada nos links que te enviei, e releia o que postei.
E não é migué, e caso de necessidade.

para ser mais exato. Leia aqui:

[quote]Abstract Classes

Abstract classes can be used to define the C++ version of interfaces. A C++ abstract class describes functionality shared by objects of all concrete classes that are explicitly listed (perhaps indirectly) as subclasses. An object may play multiple roles by inheriting and implementing multiple interfaces. (The language doesn’t directly support notions that an object may play different roles at different times, or that a role is implemented by a collection of objects, but these effects can usually be had in one way or another.)[/quote]

:shock:

[quote=marciosantri][code]type
TClassePai = class(TInterfacedObject) // Ao invés de herdar de TObject, herdar de TInterfacedObject


end;

TClasseFilha = class(TClassePai, IInterface)


end;[/code]

Qual o problema nisso?
[/quote]

sim… e se TClassePai não herdar TInterfacedObject ?
se TClassePai herdar outra classe. ?

Sua orientacao a objetos comeca a convergir toda para um “SUPER MEGA OBJETO PAI”

O C++ tornou forte o conceito de ABC, que nada mais são que as interfaces do Java.

Para uma classe abstrata ser chamada de ABC, ela deve:

a) Não ter propriedades;
b) Só ter métodos virtuais puros;
c) Ter um destrutor virtual;

Ou seja, rigorosamente idêntico a um interface.

Detalhe que ABC é a sigla de Abstract Base Class.

ABCs não sofrem o problema da herança multipla e não estão sujeitas ao DOD (Diamond of Death).

ViniGodoy…

Muito exclarecedor ! Valeu !

[quote=marciosantri][code]type
TClassePai = class(TInterfacedObject) // Ao invés de herdar de TObject, herdar de TInterfacedObject


end;

TClasseFilha = class(TClassePai, IInterface)


end;[/code]

Qual o problema nisso?
[/quote]
Do ponto de vista prático, não há nenhum problema. O que o chun tá questionando - e eu concordo com ele - são as limitações que você é obrigado a tratar porque a linguagem impõe.
Se você tem, por exemplo, a seguinte hierarquia:

Em Java ficaria:

[code]class Animal {

}

class Peixe extends Animal implements Nadador {

}[/code]E em Delphi:

TAnimal = class(TInterfacedObject); TPeixe = class(TAnimal, INadador);Veja que, no caso do Delphi, você tem uma classe de domínio acoplada a um conceito estranho ao mesmo.

Na verdade, o C++ tem um conceito de interfaces ainda mais abstrato, se levar em consideração o uso de templates.
Com templates, você pode definir uma interface unicamente pelo contrato, e deixar que o C++ crie ou não aquele método, caso a interface atenda o contrato. Não há necessidade de uma classe abstrata ou interface.

Por exemplo, o método abaixo funciona para qualquer coisa que tenha o operador > definido:

[code]
//Mytype deve ser uma classe com o operador de > definido

template
myType Maximum (myType a, myType b) {
return (a>b?a:b);
}[/code]

Quando eu digo qualquer coisa, quero dizer, numeros:
int x = Maximum(10, 20);

Quero ou uma classe:
BigDecimal x = Maximum(BigDecimal(10), BigDecimal(20));

Note que o código acima restringe a interface única e exclusivamente a:
a) Presença ou não do operador de >
b) Comentário explicando o que esse sinal deveria fazer!

E tudo isso é verificado em tempo de compilação. E notem também que isso é infinitamente mais poderoso que os generics, que o povo insiste em dizer que é “a mesma coisa que templates”.

sim, sim. Postou muito bem vinnie.

Um outro exemplo do que falei. Criei um método fábrica para a minha classe de vetores (matemáticos) assim:

template <class Coords>
Vector createVector (Coords coords) {
 return new Vector(
      static_cast<float>(coords[0]), 
      static_cast<float>(coords[1]), 
      static_cast<float>(coords[2]));
}

O que esse método diz? Que um vetor pode ser criado com quaisquer 3 pontos, desde que eles sejam acessados por índices e que sejam convertíveis para floats…

Portanto, é possível:
a) Passar um array primitivo de float;
b) Passar um objeto da própria classe Vector (que implementa o operador []);
c) Passar um objeto da classe Vector2D, Matrix2D da Ogre2D;
d) Passar um objeto IntVector da Torque.

Dessa forma, pude fazer com que minha engine se integrasse facilmente a outras. Como o contrato dessa fábrica não depende de nenhum supertipo, é possível converter de maneira facílima qualquer tipo de vetor num vetor da minha engine, mesmo um definido através de um array primitivo. Note que aqui é mais um exemplo onde a interface “Coord” restringe-se única e exclusivamente a um contrato, não a uma implementação.

isso é o que dá extrema flexibilidade a essa linguagem.