Este artículo es un artículo espejo de traducción automática, por favor haga clic aquí para saltar al artículo original.

Vista: 18805|Respuesta: 0

[Comunicación] Las similitudes y diferencias entre abstracth virtual y (abstracto) y la interfaz en C#...

[Copiar enlace]
Publicado en 22/4/2019 14:41:09 | | |
Interpretación 1

En C#, Abstracto y Virtual son confusos, ambos relacionados con la herencia, e implican el uso de sobreescritura. Hablemos de las diferencias entre ambos:

1. Método virtual

la palabra clave virtual se utiliza para modificar métodos en la clase base. Hay dos situaciones en las que se utiliza lo virtual:

Escenario 1: Un método virtual se define en la clase base, pero el método virtual no se reescribe en la clase derivada. En la llamada a la instancia de clase derivada, el método virtual utiliza el método definido por la clase base.

Escenario 2: Se define un método virtual en la clase base y luego el método se reescribe usando sobreescritura en la clase derivada. En la llamada a la instancia de clase derivada, el método virtual utiliza el método de reescritura derivada.

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

La palabra clave abstracta solo puede usarse en clases abstractas para modificar métodos, y no existe una implementación específica. La implementación de métodos abstractos debe implementarse usando la palabra clave de anulación en la clase derivada.

La diferencia más esencial entre una interfaz y una clase abstracta: una clase abstracta es una clase incompleta, una abstracción de un objeto, mientras que una interfaz es una norma conductual.


3. Palabras clave

Estático: Cuando un método se declara como Estático, el método es estático y el compilador mantiene la implementación del método en tiempo de compilación. Es decir, el método pertenece a una clase, pero no a ningún miembro, independientemente de si existe o no una instancia de la clase. Al igual que la función de entrada Static void Main, al ser una función estática, puede llamarse directamente.

Virtua: Cuando un método se declara como Virtual, es un método virtual hasta que uses la variable NombreClase = nuevo NombreClase(); Antes de declarar una instancia de una clase, esta no existe en el espacio de memoria real. Esta palabra clave se usa muy comúnmente en la herencia de clases para proporcionar soporte de polimorfismo para métodos de clase.

overrride: indica una reescritura Esta clase hereda de la clase Shape
Virtual, abstracto es decirles a otras clases que quieran heredar de él que puedes anular este método o propiedad mía, de lo contrario no está permitido.
Resumen: La declaración de método abstracto es un método que debe ser anulado por una clase derivada, que se utiliza para ser heredada; Puede considerarse un método imaginario sin realización; Si una clase contiene un método abstracto, entonces la clase debe definirse como una clase abstracta, contenga o no otros métodos generales; Las clases abstractas no pueden tener sustancias.

a) El método de la modificación virtual debe tener una implementación del método (aunque sea solo un par de brackets), y el método de la modificación abstracta no puede tener una implementación.

b) lo virtual puede reescribirse por subclases, abstract debe ser reescrito por subclases

c) Si una función de una clase es modificada por abstact, el nombre de la clase también debe modificarse con abstact

d) No se pueden crear instancias las clases modificadas abstractas.

e) Si un método en C# está preparado para reescribir la clase padre en la subclase, el método debe modificarse con virtual en la clase padre y sobreponerse en la subclase, evitando que el programador reescriba accidentalmente el método padre de la clase padre en la subclase.

Nota: Las clases modificadas con abstracto solo pueden heredarse, no instanciarse.

Interpretación 2

Tanto virtual como abstracto se utilizan para modificar la clase madre, permitiendo redefinir la clase hija sobrescribiendo la definición de la clase madre.

Tienen algo en común: si se usan para modificar métodos, deben añadirse públicos delante de ellos, de lo contrario habrá errores de compilación: los métodos virtuales o abstractos no pueden ser privados. Al fin y al cabo, añadir virtual o abstracto permite redefinir la subclase, y los miembros privados no pueden ser accedidos por la subclase.

Pero son muy diferentes. (virtual es "virtual", abstracto es "abstracto").

(1) El método de modificación virtual debe implementarse (aunque solo añada un par de llaves), mientras que el método de modificación abstracta no debe implementarse. Por ejemplo, si el método de modificación virtual no está implementado:

Error: "Test1.fun1()" debe declarar el cuerpo porque no está marcado como abstracto, externo o parcial   

Para modificadores abstractos, si se implementa:


Error: "Test2.fun2()" no puede declarar el cuerpo porque está marcado como abstracto   

(2) lo virtual puede reescribirse mediante subclases, mientras que abstracto debe ser reescrito por subclases.
No hay error en la compilación; si se reescribe el modificador de método virtual, debe añadirse la anulación delante de él (lo que indica al compilador que quieres reescribir el método virtual), y debe haber una implementación, de lo contrario la compilación será incorrecta:
(3) Si un miembro de clase es modificado por abstract, abstract debe añadirse antes que la clase, porque solo las clases abstractas pueden tener métodos abstractos.

(4) No se pueden crear instancias de clases abstractas, solo pueden heredarse y no pueden instanciarse, por ejemplo: BaseTest2 base2 = nuevo BaseTest2(); Habrá un error de compilación: la clase abstracta o la interfaz no puede crear una instancia.

(5) En C#, si quieres reescribir un método en una subclase, debes añadir virtual antes del método padre y sobrescribir antes del método de subclase, para evitar que los programadores reescriban accidentalmente el método padre en la subclase.

(6) El método abstracto debe ser sobrescrito y el método virtual debe tener una implementación (incluso si es un método definido en la clase abstracta).
Interpretación 3
Similitudes:
1. Todos pueden heredarse
2. Ninguno de ellos puede ser instanciado
3. Puede contener declaraciones de método
4. Las clases derivadas deben implementar métodos no realizados
Distinguir:
1. Las clases base abstractas pueden definir campos, atributos e implementaciones de métodos. Las interfaces solo pueden definir atributos, indexadores, eventos y declaraciones de métodos, y no pueden contener campos.
2. Una clase abstracta es una clase incompleta que necesita ser refinada aún más, mientras que una interfaz es una norma conductual. Las interfaces personalizadas de Microsoft siempre vienen con un campo capaz para demostrar que son expresiones del "Puedo hacerlo..." ”
3. Las interfaces pueden implementarse varias veces, y las clases abstractas solo pueden ser heredadas por una sola persona
4. Las clases abstractas están más definidas entre una serie de clases estrechamente relacionadas, mientras que la mayoría de las interfaces están vagamente relacionadas pero todas implementan una función determinada
5. Las clases abstractas son conceptos abstraídos de una serie de objetos relacionados, por lo que reflejan la común internidad de las cosas; Una interfaz es una convención funcional definida para satisfacer llamadas externas, por lo que refleja las características externas de las cosas
6. La interfaz básicamente no tiene características específicas de herencia, solo promete un método que puede llamarse
7. La interfaz puede usarse para soportar callbacks, pero herencia no cuenta con esta función
8. Los métodos específicos implementados por las clases abstractas son virtuales por defecto, pero los métodos de interfaz en la clase que implementan la interfaz no son virtuales por defecto; por supuesto, también puedes declararlos virtuales
9. Si la clase abstracta implementa la interfaz, el método en la interfaz puede mapearse a la clase abstracta como un método abstracto sin necesidad de implementarlo, pero el método en la interfaz puede implementarse en la subclase de la clase abstracta
Reglas de uso:
1. Las clases abstractas se usan principalmente para objetos estrechamente relacionados, mientras que las interfaces se usan mejor para proporcionar funcionalidad general para clases irrelevantes
2. Si quieres diseñar una unidad funcional grande, utiliza clases abstractas; Si quieres diseñar bloques funcionales pequeños y concisos, usa interfaces.
3. Si se espera que se creen múltiples versiones del componente, se crea una clase abstracta. Una vez creada una interfaz, no se puede cambiar. Si se requiere una nueva versión de la interfaz, debe crearse una interfaz completamente nueva.
4. Si la función creada se usará entre una amplia gama de objetos heterogéneos, utiliza la interfaz; Si quieres proporcionar funcionalidad implementada común en todas las implementaciones de un componente, usa clases abstractas.
5. Analizar el objeto, refinar la común interna para formar una clase abstracta, que se utiliza para expresar la esencia del objeto, es decir, el "qué". Las interfaces se priorizan cuando es necesario ampliar llamadas o funciones externas
6. Una buena definición de interfaz debe ser específica y funcional, no multifuncional, de lo contrario causará contaminación de la interfaz. Si una clase solo implementa una función de la interfaz, pero tiene que implementar otros métodos en la interfaz, se denomina contaminación de interfaz
7. Intenta evitar usar la herencia para lograr la función de formación, pero utiliza multiplexación de caja negra, es decir, combinación de objetos. Debido al aumento en el número de niveles de herencia, la consecuencia más directa es que cuando llamas a una clase en este taxón, tienes que cargarlos todos en la pila. Las consecuencias pueden imaginarse. (Combinado con la comprensión del principio de pila). Al mismo tiempo, los amigos interesados pueden notar que Microsoft suele usar el método de combinación de objetos al crear una clase. Por ejemplo, en asp.net, la clase Page tiene propiedades como Server Request, pero en realidad son todos objetos de una determinada clase. Utilizar este objeto de la clase Page para llamar a los métodos y propiedades de otras clases es un principio de diseño muy básico
Por ejemplo:
Los formularios de ventana pueden diseñarse con clases abstractas, y las operaciones y propiedades públicas pueden colocarse en una clase abstracta, de modo que el formulario y el cuadro de diálogo puedan heredar de esta clase abstracta, y luego expandirse y mejorar según sus propias necesidades.

La operación de impresión puede proporcionarse como interfaz para cada formulario que necesite esta función, porque el contenido del formulario es diferente y deben implementar su propia función de impresión según sus propios requisitos. Al imprimir, solo se llama a través de la interfaz, independientemente del formulario que se esté imprimiendo.

Común, individualidad y elección:
Algunos libros escriben que C# recomienda usar interfaces en lugar de clases base abstractas, y enfatizan los muchos beneficios de usar interfaces, con los que no me atrevo a discrepar, a partir de la lista anterior, todavía existen muchas diferencias entre ambas, y la existencia de esta diferencia debe determinar la diferencia en escenarios aplicables; por ejemplo, en la clase base abstracta puede proporcionar implementaciones predeterminadas para algunos métodos, para evitar implementaciones repetidas en subclases y mejorar la reutilización del código. Esta es la ventaja de las clases abstractas; La interfaz solo puede contener métodos abstractos. En cuanto a cuándo usar clases base abstractas y cuándo usar interfaces, depende de cómo los usuarios perciban las conexiones entre clases heredadas, ya sean diferencias de personalidad o conexiones comunes entre ellas. Déjame ilustrarlo con un ejemplo de la vida.

Si te dan tres objetos, a saber, personas, peces y ranas, y te piden diseñar una categoría base para que resuman la conexión entre ellos, lo primero que notarás es que hay grandes diferencias entre ellos y es difícil abstraer las similitudes. Aquí es donde deberías considerar usar interfaces en lugar de clases base abstractas por tres razones:
1. La individualidad es mayor que la común.
2. Las personalidades con grandes diferencias tienen algunos de los mismos comportamientos.
3. Existen grandes diferencias en los métodos de realización de ese mismo comportamiento.
En este momento, te dan tres objetos más, a saber, carpa cruciana, carpa y pez dorado, y aún así te permiten diseñar clases base para resumir la conexión entre ellas; luego lo primero que te das cuenta es que todos pertenecen a peces, y lo segundo es que la forma en que nadan puede ser ligeramente diferente, así que deberías usar clases base abstractas en lugar de interfaces; comparado con el ejemplo anterior, hay tres razones:
1. La común es mayor que la individualidad
2. Las personas con la misma similitud deben tener los mismos atributos y comportamientos
3. Existen ciertas diferencias en los métodos de implementación del mismo comportamiento
Entre las varias razones para usar interfaces o clases base abstractas, la tercera razón es en realidad la misma, que describe el concepto de polimorfismo en orientado a objetos, es decir, se implementa sobrescribiendo la clase padre y llamando al método correspondiente en tiempo de ejecución según la referencia al objeto pasada. La segunda razón comienza a divergir, con interfaces que enfatizan el mismo comportamiento entre objetos heredados, mientras que las clases abstractas también enfatizan las mismas propiedades entre objetos heredados. Lo que realmente distingue a las interfaces de las clases base abstractas son las siguientes razones:

Las interfaces se utilizan cuando se busca una similitud funcional entre objetos con grandes diferencias.
Se utilizan clases base abstractas cuando se buscan diferencias funcionales entre objetos con mayor similitud.
Al comparar lo mismo y lo diferente, solo podemos decir que las interfaces y las clases abstractas tienen sus propias fortalezas, pero no hay ventajas. En la práctica real de la programación, necesitamos medir nuestros talentos según la situación específica, pero la experiencia y acumulación que sigue puede darte algo de inspiración, además de parte de mi acumulación, muchas de ellas provienen de los clásicos, creo que pueden resistir la prueba. Así que en las reglas y ocasiones, aprendemos estos clásicos, lo más importante es aplicar lo que hemos aprendido, por supuesto, me ganaré la risa de todos con las palabras de una familia, por favor, continúa.

Reglas y ocasiones:
1. Recuerda que uno de los principios más importantes del pensamiento orientado a objetos es: la programación orientada a interfaces.
2. Con la ayuda de interfaces y clases abstractas, muchas ideas de los 23 patrones de diseño se han implementado de forma inteligente, y creo que su esencia es simplemente que están orientadas a la programación abstracta.
3. Las clases abstractas deben usarse principalmente para objetos estrechamente relacionados, mientras que las interfaces se emplean mejor para proporcionar funcionalidad general para clases irrelevantes.
4. La interfaz se centra en el tipo de relación CAN-DO, mientras que la clase abstracta se centra en la relación IS-A.
5. El comportamiento de objetos multidefinidos en la interfaz; las clases abstractas definen múltiples propiedades de los objetos;
6. Las definiciones de interfaz pueden usar modificadores públicos, protegidos, internos y privados, pero casi todas las interfaces se definen como públicas, por lo que no es necesario decir más.
7. "La interfaz permanece sin cambios" es un factor importante que debe considerarse. Por lo tanto, al añadir extensiones desde interfaces, deben añadirse nuevas interfaces, no las existentes.
8. Intenta diseñar la interfaz en un bloque funcional con una sola función, tomando como ejemplo .NET Framework, IDisposable, IDisposable, IComparable, IEquatable, IEnumerable, etc., contienen solo un método común.
9. La letra mayúscula "I" delante del nombre de la interfaz es una convención, así como el nombre del campo comienza con un guion bajo, por favor respeta estos principios.
10. En la interfaz, todos los métodos son públicos por defecto.
11. Si se esperan problemas de versión, puedes crear una "clase abstracta". Por ejemplo, si creas un perro, una gallina y un pato, deberías considerar abstraer animales para que puedan afrontar cosas que puedan surgir en el futuro. Añadir nuevos miembros a la interfaz obliga a modificar y recompilar todas las clases derivadas, por lo que los problemas de versionado se implementan mejor con clases abstractas.
12. Las clases no abstractas derivadas de clases abstractas deben incluir todos los métodos abstractos heredados y las implementaciones reales de accesorios abstractos.
13. La nueva palabra clave no puede usarse para clases abstractas, ni pueden sellarse, porque las clases abstractas no pueden ser instanciadas.
14. No se pueden usar modificadores estáticos o virtuales en declaraciones abstractas de métodos.





Anterior:El diseño de permisos sencillo de C# Enum utiliza la propiedad FlagsAttribute
Próximo:El aula Yiyun de Huang Yong tiene una comprensión basada en cero del programa mini WeChat
Renuncia:
Todo el software, materiales de programación o artículos publicados por Code Farmer Network son únicamente para fines de aprendizaje e investigación; El contenido anterior no se utilizará con fines comerciales o ilegales; de lo contrario, los usuarios asumirán todas las consecuencias. La información de este sitio proviene de Internet, y las disputas de derechos de autor no tienen nada que ver con este sitio. Debes eliminar completamente el contenido anterior de tu ordenador en un plazo de 24 horas desde la descarga. Si te gusta el programa, por favor apoya el software genuino, compra el registro y obtén mejores servicios genuinos. Si hay alguna infracción, por favor contáctanos por correo electrónico.

Mail To:help@itsvse.com