Eu quero saber se uma classe pode herdar de uma classe e uma interface. O código de exemplo abaixo não funciona, mas acho que ele transmite o que quero fazer. A razão pela qual eu quero fazer isso é porque, na minha empresa, fabricamos dispositivos USB, serial, Ethernet, etc. Estou tentando desenvolver um componente / interface genérico que possa ser usado para escrever programas para todos os nossos dispositivos que ajudarão a manter as coisas comuns (como conectar, desconectar, obter firmware) iguais para todos os nossos aplicativos.
Para adicionar a esta pergunta: Se GenericDevice estiver em um projeto diferente, posso colocar a interface IOurDevices nesse projeto e fazer com que a classe USBDevice implemente a interface se adicionar uma referência ao primeiro projeto? Porque gostaria de referenciar apenas um projeto e, em seguida, implementar interfaces diferentes, dependendo do dispositivo.
class GenericDevice
{
private string _connectionState;
public connectionState
{
get{return _connectionState; }
set{ _connectionState = value;}
}
}
interface IOurDevices
{
void connectToDevice();
void DisconnectDevice();
void GetFirmwareVersion();
}
class USBDevice : IOurDevices : GenericDevice
{
//here I would define the methods in the interface
//like this...
void connectToDevice()
{
connectionState = "connected";
}
}
//so that in my main program I can do this...
class myProgram
{
main()
{
USBDevice myUSB = new USBDevice();
myUSB.ConnectToDevice;
}
}
fonte
Respostas:
Sim. Experimentar:
Nota: A classe base deve vir antes da lista de nomes de interface.
Obviamente, você ainda precisará implementar todos os membros que as interfaces definem. No entanto, se a classe base contiver um membro que corresponda a um membro da interface, ele poderá funcionar como a implementação do membro da interface e você não precisará implementá-lo manualmente novamente.
fonte
USBDevice : IOurDevice
. Adicionar a implementação explicitamente não afeta a classe base, mas pode ajudar a colocar ênfase na interface.Não exatamente. Mas pode herdar de uma classe e implementar uma ou mais interfaces.
Uma terminologia clara é importante ao discutir conceitos como este. Uma das coisas que você verá marcar os escritos de Jon Skeet, por exemplo, aqui e na imprensa, é que ele é sempre preciso na maneira como descreve as coisas.
fonte
Sem relação com a pergunta (a resposta de Mehrdad deve ajudá-lo), e espero que isso não seja entendido: as classes não herdam interfaces, elas as implementam .
O .NET não suporta herança múltipla, portanto, manter os termos corretos pode ajudar na comunicação. Uma classe pode herdar de uma superclasse e implementar quantas interfaces desejar.
Em resposta ao comentário de Eric ... tive uma discussão com outro desenvolvedor sobre se as interfaces "herdam", "implementam", "exigem" ou "trazem" interfaces com uma declaração como:
A resposta técnica é que
ITwo
herdaIOne
por alguns motivos:ITwo
implementaIOne
é totalmente erradoITwo
herdaIOne
métodos, seMethodOne()
existirIOne
, também é acessível a partir deITwo
. ie:((ITwo)someObject).MethodOne())
é válido, mesmo queITwo
não contenha explicitamente uma definição paraMethodOne()
typeof(IOne).IsAssignableFrom(typeof(ITwo))
retornatrue
Finalmente concordamos que as interfaces suportam herança verdadeira / completa. Os recursos de herança ausentes (como substituições, acessadores abstratos / virtuais etc.) estão ausentes nas interfaces, não na herança da interface. Ainda não torna o conceito simples ou claro, mas ajuda a entender o que realmente está acontecendo no mundo de Eric :-)
fonte
Encontrei a resposta para a segunda parte das minhas perguntas. Sim, uma classe pode implementar uma interface que esteja em uma classe diferente, desde que a interface seja declarada como pública.
fonte
class ContainsAll { private interface INested { /* ... */ } private class MyExample : INested { /* ... */ } }
, aMyExample
classe implementa uma interface privada aninhada. Em outros exemplos, a interface aninhada (e a classe que contém) poderia serinternal
. Tudo depende de quem precisa usá-los e se preocupar com eles.