Uma introdução à herança entre linguagens em .NET.
A introdução do .NET torna o desenvolvimento da linguagem mais simples do que nunca. Não precisamos mais nos preocupar em usar wrappers ATL em C++ para acessar componentes VB ou chamar convenções ao tentar fazer interface com código FORTRAN. Todas as linguagens habilitadas para .NET são agora entidades de primeira classe e interoperam perfeitamente, permitindo que sistemas diferentes trabalhem juntos com mais facilidade do que nunca e também permitindo que desenvolvedores com diferentes conjuntos de habilidades trabalhem harmoniosamente juntos em projetos.
Criar um componente em uma linguagem que possa ser usado por outra linguagem é muito simples. Use o Assistente do Visual Studio.NET para criar uma biblioteca de classes em sua linguagem .NET favorita, compile-a e pronto.
Por exemplo, criaremos uma classe simples em C# que expõe dois métodos:
namespace MyCSClass
{
using System;
public class CSClass
{
public CSClass () { }
// returns the length of the passed string
public int MyMethod (string str)
{
return str. Length ;
}
// returns n squared
virtual public int MyVirtualMethod ( int n)
{
return n*n;
}
}
}
O primeiro método, MyMethod
, pega um objeto string e retorna seu comprimento. O segundo método é virtual e retorna o quadrado do número passado. Suponha que compilamos este componente para MyCSClass.dll .
Para consumir este componente usando C++ gerenciado, precisamos primeiro importar o assembly para nosso programa:
# using " MyCSClass.dll "
É isso. Sem typelibs, sem arquivos .def, sem cabeçalhos ATL. Simplesmente usamos a instrução #using
(e garantimos que a dll esteja no caminho de pesquisa do compilador) e deixamos o compilador fazer o resto.
Depois de importar a classe, podemos usar a declaração using
para salvar a digitação:
using namespace MyCSClass ;
Observe a diferença aqui: #using
serve para importar uma montagem para o seu projeto. using
especifica o namespace com o qual trabalharemos e apenas salva a digitação.
Na verdade, consumir a classe é o mesmo que usar qualquer outro tipo de referência gerenciada no .NET:
CSClass *cs = new CSClass();
int result;
result = cs-> MyMethod ( " Hello World " ); // will return 11
result = cs-> MyVirtualMethod ( 2 ); // will return 2 squared
A interoperabilidade entre idiomas vai além de simplesmente facilitar o uso de componentes escritos em idiomas diferentes. Também podemos herdar novas classes de componentes escritos em outras linguagens, sem precisar do código-fonte original do componente .
Imagine que você comprou ou adquiriu algum componente super legal que adora usar, mas que gostaria que tivesse mais um ou dois recursos ou que fizesse algo um pouco diferente. No .NET você pode herdar uma nova classe desse componente para criar um novo componente que funcione exatamente como você gostaria. Você não está criando um wrapper para o componente: você está criando um novo componente que deriva suas propriedades, métodos e campos e que pode substituir os métodos virtuais do componente antigo e adicionar novos métodos.
De volta ao nosso exemplo. O método CSClass::MyVirtualMethod
é virtual, então vamos declarar uma nova classe C++ derivada dessa classe C# e substituir esse método virtual
__gc class CPPClass : public MyCSClass ::CSClass
{
public:
// returns the cube of the given number
virtual int MyVirtualMethod ( int n)
{
return n*n*n;
}
};
Substituímos CSClass::MyVirtualMethod
por nosso novo método que retorna o cubo, não o quadrado, do número fornecido. Depois de compilarmos o código, teremos um novo componente C++ que substitui o método virtual na classe C# e também possui a função não virtual MyMethod()
.
CPPClass *cpp = new CPPClass();
int result;
result = cpp-> MyMethod ( " Hello World " ); // will return 11
result = cpp-> MyVirtualMethod ( 2 ); // Will output 2 cubed, not 2 squared
O download que acompanha este artigo contém um componente C# e VB.NET que é consumido e herdado por um componente C++.
A interoperabilidade entre linguagens permite estender componentes de terceiros com sua própria funcionalidade de maneira orientada a objetos. Você pode trabalhar facilmente com componentes em qualquer linguagem compatível com CLS e, ao depurar, poderá percorrer chamadas de função entre componentes e entre linguagens no mesmo aplicativo. O tratamento de exceções também é consistente em todas as linguagens. Se um componente em uma linguagem lançar uma exceção, ele poderá ser capturado e tratado por código escrito em outra linguagem. Mais importante ainda, permite que você e sua equipe tenham liberdade para escolher o idioma em que desejam trabalhar.
16 de outubro de 2001 - atualizado para beta 2