Este artigo é um artigo espelhado de tradução automática, por favor clique aqui para ir para o artigo original.

Vista: 18805|Resposta: 0

[Comunicação] As semelhanças e diferenças entre o virtual e o (abstrato) abstracth e interface em C#...

[Copiar link]
Publicado em 22/04/2019 14:41:09 | | |
Interpretação 1

Em C#, Abstrato e Virtual são confusos, ambos relacionados à herança, e envolvem o uso de sobreposição. Vamos discutir as diferenças entre os dois:

1. Método virtual

A palavra-chave virtual é usada para modificar métodos na classe base. Existem duas situações em que o virtual é usado:

Cenário 1: Um método virtual é definido na classe base, mas o método virtual não é reescrito na classe derivada. Na chamada para a instância da classe derivada, o método virtual usa o método definido pela classe base.

Cenário 2: Um método virtual é definido na classe base e então o método é reescrito usando override na classe derivada. Na chamada para a instância de classe derivada, o método virtual usa o método de reescrita derivada.

2. Método abstrato (método abstrato)

A palavra-chave abstrata só pode ser usada em classes abstratas para modificar métodos, e não há uma implementação específica. A implementação de métodos abstratos deve ser implementada usando a palavra-chave de substituição na classe derivada.

A diferença mais essencial entre uma interface e uma classe abstrata: uma classe abstrata é uma classe incompleta, uma abstração de um objeto, enquanto uma interface é uma norma comportamental.


3. Palavras-chave

Estático: Quando um método é declarado como Estático, o método é estático e o compilador mantém a implementação do método em tempo de compilação. Ou seja, o método pertence a uma classe, mas não a nenhum membro, independentemente de existir ou não uma instância da classe. Assim como a função de entrada Static void Main, por ser uma função estática, pode ser chamada diretamente.

Virtua: Quando um método é declarado como Virtual, ele é um método virtual até que você use a variável ClassName = novo ClassName(); Antes de declarar uma instância de uma classe, ela não existe no espaço de memória real. Essa palavra-chave é muito comumente usada na herança de classes para fornecer suporte a polimorfismo para métodos de classes.

overrride: indica uma reescrita Esta classe herda da classe Shape
Virtual, abstrato é para dizer a outras classes que querem herdar dele que você pode sobrescrever esse método ou propriedade minha, caso contrário não é permitido.
Resumo: Declaração de método abstrato é um método que deve ser sobrescrito por uma classe derivada, que é usada para ser herdada; Pode ser considerado um método imaginário sem realização; Se uma classe contém um método abstrato, então a classe deve ser definida como uma classe abstrata, contenha ou não outros métodos gerais; Classes abstratas não podem ter substâncias.

a) O método da modificação virtual deve ter uma implementação do método (mesmo que seja apenas um par de colchetes), e o método da modificação abstrata não pode ter uma implementação.

b) virtual pode ser reescrito por subclasses, abstract deve ser reescrito por subclasses

c) Se uma função em uma classe for modificada por abstact, o nome da classe também deve ser modificado com abstact

d) Classes modificadas abstratas não podem ser instâncias criadas.

e) Se um método em C# estiver preparado para reescrever a classe pai na subclasse, o método deve ser modificado com virtual na classe pai e overide na subclasse, evitando que o programador reescreva acidentalmente o método pai da classe pai na subclasse.

Nota: Classes modificadas com abstrato só podem ser herdadas, não instanciadas.

Interpretação 2

Tanto virtual quanto abstrato são usados para modificar a classe pai, permitindo que a classe filha seja redefinida ao sobrescrever a definição da classe pai.

Eles têm uma coisa em comum: se forem usados para modificar métodos, o público deve ser adicionado à frente deles, caso contrário haverá erros de compilação: métodos virtuais ou métodos abstratos não podem ser privados. Afinal, adicionar virtual ou abstrato permite que a subclasse seja redefinida, e membros privados não podem ser acessados pela subclasse.

Mas eles são muito diferentes. (virtual é "virtual", abstrato é "abstrato").

(1) O método de modificação virtual deve ser implementado (mesmo que apenas adicione um par de colchetes), enquanto o método de modificação abstrata não deve ser implementado. Por exemplo, se o método de modificação virtual não for implementado:

Erro: "Test1.fun1()" deve declarar o corpo porque ele não está marcado como abstrato, externo ou parcial   

Para modificadores abstratos, se implementados:


Erro: "Test2.fun2()" não pode declarar o corpo porque ele está marcado como abstrato   

(2) virtual pode ser reescrito por subclasses, enquanto abstrato deve ser reescrito por subclasses.
Não há erro na compilação, se o modificador do método virtual for reescrito, a substituição deve ser adicionada antes dele (o que informa ao compilador que você quer reescrever o método virtual), e deve haver uma implementação, caso contrário a compilação estará errada:
(3) Se um membro da classe for modificado por abstrato, abstract deve ser adicionado antes da classe, pois apenas classes abstratas podem ter métodos abstratos.

(4) Instâncias de classes abstratas não podem ser criadas, elas só podem ser herdadas e não podem ser instanciadas, por exemplo: BaseTest2 base2 = novo BaseTest2(); Haverá um erro de compilação: A classe abstrata ou interface não pode criar uma instância.

(5) Em C#, se você quiser reescrever um método em uma subclasse, deve adicionar virtual antes do método pai e sobrescrever antes do método da subclasse, para evitar que programadores reescrevam acidentalmente o método pai na subclasse.

(6) O método abstrato deve ser sobrescrevido, e o método virtual deve ter uma implementação (mesmo que seja um método definido na classe abstrata).
Interpretação 3
Semelhanças:
1. Todos podem ser herdados
2. Nenhuma delas pode ser instanciada
3. Pode conter declarações de método
4. Classes derivadas devem implementar métodos não realizados
Distinguir:
1. Classes base abstratas podem definir campos, atributos e implementações de métodos. Interfaces só podem definir atributos, indexadores, eventos e declarações de métodos, e não podem conter campos.
2. Uma classe abstrata é uma classe incompleta que precisa ser refinada ainda mais, enquanto uma interface é uma norma comportamental. As interfaces personalizadas da Microsoft sempre vêm com um campo capaz de provar que são expressões do "Eu consigo..." ”
3. Interfaces podem ser implementadas várias vezes, e classes abstratas só podem ser herdadas por uma única pessoa
4. Classes abstratas são mais definidas entre uma série de classes intimamente relacionadas, enquanto a maioria das interfaces é vagamente relacionada, mas todas implementam uma determinada função
5. Classes abstratas são conceitos abstratos de uma série de objetos relacionados, então refletem a comunalidade interna das coisas; Uma interface é uma convenção funcional definida para satisfazer chamadas externas, então reflete as características externas das coisas
6. A interface basicamente não possui características específicas de herança, ela apenas promete um método que pode ser chamado
7. A interface pode ser usada para suportar callbacks, mas a herança não possui esse recurso
8. Os métodos específicos implementados por classes abstratas são virtuais por padrão, mas os métodos de interface na classe que implementam a interface são não virtuais por padrão, claro, você também pode declará-los virtuais
9. Se a classe abstrata implementar a interface, o método na interface pode ser mapeado para a classe abstrata como um método abstrato sem precisar implementá-lo, mas o método na interface pode ser implementado na subclasse da classe abstrata
Regras de uso:
1. Classes abstratas são usadas principalmente para objetos intimamente relacionados, enquanto interfaces são melhores para fornecer funcionalidades gerais para classes irrelevantes
2. Se você quiser projetar uma unidade funcional grande, use classes abstratas; Se quiser projetar blocos funcionais pequenos e concisos, use interfaces.
3. Se se espera que múltiplas versões do componente sejam criadas, crie uma classe abstrata. Uma vez criada uma interface, ela não pode ser alterada. Se uma nova versão da interface for necessária, uma interface completamente nova deve ser criada.
4. Se a função criada for usada entre uma ampla gama de objetos heterogêneos, use a interface; Se você quiser fornecer funcionalidades implementadas comuns em todas as implementações de um componente, use classes abstratas.
5. Analisar o objeto, refinar a comunhão interna para formar uma classe abstrata, que é usada para expressar a essência do objeto, ou seja, o "quê". Interfaces são priorizadas quando chamadas ou funções externas precisam ser expandidas
6. Uma boa definição de interface deve ser específica e funcional, não multifuncional, caso contrário causará poluição da interface. Se uma classe implementar apenas uma função da interface, mas precisar implementar outros métodos na interface, isso é chamado de poluição da interface
7. Tente evitar usar herança para alcançar a função de formação, mas use multiplexação de caixa-preta, ou seja, combinação de objetos. Por causa do aumento no número de níveis de herança, a consequência mais direta é que, quando você chama uma classe nesse táxon, precisa carregá-las todas na pilha! As consequências podem ser imaginadas. (Combinado com o entendimento do princípio da pilha). Ao mesmo tempo, amigos interessados podem notar que a Microsoft frequentemente usa o método de combinação de objetos ao construir uma classe. Por exemplo, em asp.net, a classe Page possui propriedades como Server Request, mas na verdade todas são objetos de uma determinada classe. Usar esse objeto da classe Page para chamar os métodos e propriedades de outras classes é um princípio de design muito básico
Por exemplo:
Formas de janela podem ser projetadas com classes abstratas, e operações e propriedades públicas podem ser colocadas em uma classe abstrata, de modo que a forma e a caixa de diálogo possam herdar dessa classe abstrata, e então expandir e melhorar conforme suas próprias necessidades.

A operação de impressão pode ser fornecida como uma interface para cada formulário que precise dessa função, pois o conteúdo do formulário é diferente e eles precisam implementar sua própria função de impressão conforme seus próprios requisitos. Ao imprimir, ela só é chamada pela interface, independentemente do formulário que esteja sendo impresso.

Comum, Individualidade e Escolha:
Alguns livros escrevem que C# recomenda o uso de interfaces em vez de classes base abstratas, e enfatizam os muitos benefícios do uso de interfaces, com os quais não ouso discordar; da lista acima, ainda existem muitas diferenças entre as duas, e a existência dessa diferença deve determinar a diferença em cenários aplicáveis, por exemplo, na classe base abstrata pode fornecer implementações padrão para alguns métodos, para evitar implementações repetidas delas em subclasses e melhorar a reutilização do código. Essa é a vantagem das classes abstratas; A interface só pode conter métodos abstratos. Quanto a quando usar classes base abstratas e quando usar interfaces, depende de como os usuários veem as conexões entre classes herdadas, se são diferenças de personalidade ou conexões comuns entre elas. Deixe-me ilustrar com um exemplo de vida.

Se você recebe três objetos, nomeadamente pessoas, peixes e sapos, e é solicitado a desenhar uma categoria base para que eles resumam a conexão entre eles, então a primeira coisa que você sentirá é que há grandes diferenças entre eles, e é difícil abstrair as semelhanças. É aí que você deve considerar usar interfaces em vez de classes base abstratas, por três razões:
1. Individualidade é maior do que a comum.
2. Personalidades com grandes diferenças têm alguns dos mesmos comportamentos.
3. Existem grandes diferenças nos métodos de realização do mesmo comportamento.
Neste momento, você recebe mais três objetos, a saber, carpa-cruciana, carpa e peixinho-dourado, e ainda assim pode criar classes base para resumir a conexão entre elas, aí a primeira coisa que você percebe é que todas pertencem aos peixes, e a segunda é que a forma como eles nadam pode ser um pouco diferente, então você deve usar classes base abstratas em vez de interfaces, comparado ao exemplo acima, há três razões:
1. A comunalidade é maior do que a individualidade
2. Indivíduos com a mesma semelhança devem ter os mesmos atributos e comportamentos
3. Existem certas diferenças nos métodos de implementação do mesmo comportamento
Entre as várias razões para usar interfaces ou classes base abstratas, a terceira razão é na verdade a mesma, que descreve o conceito de polimorfismo no orientado a objetos, ou seja, ele é implementado sobrescrevendo a classe pai e chamando o método correspondente em tempo de execução de acordo com a referência ao objeto passada. A segunda razão começa a divergir, com interfaces enfatizando o mesmo comportamento entre objetos herdados, enquanto classes abstratas também enfatizam as mesmas propriedades entre objetos herdados. O que realmente distingue interfaces de classes base abstratas são as seguintes razões:

Interfaces são usadas quando se busca uma comunalidade funcional entre objetos com grandes diferenças.
Classes base abstratas são usadas quando se buscam diferenças funcionais entre objetos com mais comunhão.
Ao comparar o mesmo e o diferente, só podemos dizer que interfaces e classes abstratas têm suas próprias qualidades, mas não há vantagens. Na prática real de programação, precisamos medir nossos talentos de acordo com a situação específica, mas a experiência e acumulação a seguir podem te inspirar, além de parte da minha acumulação, muitos deles vêm dos clássicos, acredito que eles podem resistir ao teste. Então, nas regras e ocasiões, aprendemos esses clássicos, o mais importante é aplicar o que aprendemos, claro, vou conquistar a risada de todos com as palavras de uma família, por favor, continuem.

Regras e ocasiões:
1. Lembre-se de que um dos princípios mais importantes do pensamento orientado a objetos é: programação orientada a interfaces.
2. Com a ajuda de interfaces e classes abstratas, muitas ideias dos 23 padrões de design foram implementadas de forma inteligente, e acredito que sua essência é simplesmente que são orientadas para a programação abstrata.
3. Classes abstratas devem ser usadas principalmente para objetos intimamente relacionados, enquanto interfaces são melhor usadas para fornecer funcionalidades gerais para classes irrelevantes.
4. A interface foca no tipo de relação CAN-DO, enquanto a classe abstrata foca na relação IS-A.
5. O comportamento de objetos multidefinidos na interface; classes abstratas definem múltiplas as propriedades dos objetos;
6. Definições de interface podem usar modificadores públicos, protegidos, internos e privados, mas quase todas as interfaces são definidas como públicas, então não há necessidade de dizer mais.
7. "A interface permanece inalterada" é um fator importante que deve ser considerado. Portanto, ao adicionar extensões a partir de interfaces, novas interfaces devem ser adicionadas, não interfaces existentes.
8. Tente projetar a interface em um bloco funcional com uma única função, tomando o .NET Framework como exemplo, IDisposable, IDisposable, IComparable, IEquatable, IEnumerable, etc., todos contêm apenas um método comum.
9. A letra maiúscula "I" à frente do nome da interface é uma convenção, assim como o nome do campo começa com um sublinhado, por favor, siga esses princípios.
10. Na interface, todos os métodos padrão são públicos.
11. Se forem esperados problemas de versão, você pode criar uma "classe abstrata". Por exemplo, se você criar um cachorro, uma galinha e um pato, deve considerar abstrair animais para lidar com coisas que possam surgir no futuro. Adicionar novos membros à interface força todas as classes derivadas a serem modificadas e recompiladas, então problemas de versionamento são melhor implementados com classes abstratas.
12. Classes não abstratas derivadas de classes abstratas devem incluir todos os métodos abstratos herdados e implementações reais de acessores abstratos.
13. A nova palavra-chave não pode ser usada para classes abstratas, nem podem ser seladas, porque classes abstratas não podem ser instanciadas.
14. Modificadores estáticos ou virtuais não podem ser usados em declarações de métodos abstratos.





Anterior:O design simples de permissão de C# Enum usa a propriedade FlagsAttribute
Próximo:A sala de aula Yiyun de Huang Yong tem um entendimento zero do miniprograma WeChat
Disclaimer:
Todo software, material de programação ou artigos publicados pela Code Farmer Network são apenas para fins de aprendizado e pesquisa; O conteúdo acima não deve ser usado para fins comerciais ou ilegais, caso contrário, os usuários terão todas as consequências. As informações deste site vêm da Internet, e disputas de direitos autorais não têm nada a ver com este site. Você deve deletar completamente o conteúdo acima do seu computador em até 24 horas após o download. Se você gosta do programa, por favor, apoie um software genuíno, compre o registro e obtenha serviços genuínos melhores. Se houver qualquer infração, por favor, entre em contato conosco por e-mail.

Mail To:help@itsvse.com