Problemas en la herencia de C#
C# no permite que una subclase tenga varias clases principales.
C# permite la herencia múltiple de interfaces, pero no permite la herencia múltiple de clases, por lo que dos o más herencias en C# solo se pueden lograr a través de interfaces, y la herencia múltiple de clases está permitida en C.
Los ejemplos son los siguientes
Usar el sistema;
Usar el sistema. recolectar. Genérico;
Uso del sistema. Linq
Usa el sistema. text;
Herencia del espacio de nombres
{
Interfaz pública Ishape
{
área doble(); /p>
doble GramLength();
Borde medio
{
obtener
}
}
Interfaz pública IshapePlay
{
void Play();
}
Clase pública Square : Ishape, IshapePlay
{
Private int Side;
public int SideLength
Public Square()
{
Número de lados = 4;
}
Público interno
{
Obtener p> p>
{
Devolver ambos lados;
}
}
Doble área pública()
{
return ((double)(longitud del lado*longitud del lado));
}
Público doble GramLength()
{
return((double)(Lados * longitud del lado));
}
Juego de vacío público()
{
Consola. writeline("\nEl método de cálculo del área cuadrada es el siguiente:");
Console. WriteLine("Longitud del lado:", this. Longitud del lado);
Consola. WriteLine("Número de lados:", this. lados);
Consola. WriteLine ("área:", this.area());
}
}
Plan de clases
{
static void Main(string[] args)
{
Cuadrado cuadrado = new Cuadrado();
sq. Longitud del lado = 8;
m2. play();
}
}
}
Una clase con la palabra clave abstract pero no completamente definida en el contenido de implementación llamada abstract clase.
La diferencia entre clases abstractas e interfaces es la siguiente:
① Cuando una clase hereda una clase abstracta, solo necesita implementar algunos métodos específicos y todos los métodos abstractos, mientras que la interfaz necesita implementar todos los métodos.
② No hay variables miembro en la interfaz, pero puede haber variables miembro en la clase abstracta.
Las interfaces se introdujeron en Java principalmente para resolver el problema de la herencia múltiple.
1) Las interfaces no pueden tener métodos no abstractos, pero las clases abstractas sí.
2) Una clase puede implementar múltiples interfaces, pero solo puede tener una clase principal.
3) Las interfaces no pertenecen a la estructura de herencia y en realidad no tienen nada que ver con la herencia, por lo que las clases no relacionadas también pueden implementar la misma interfaz.
Clases y métodos abstractos
En todos nuestros ejemplos de instrumentos, los métodos en la clase de instrumento base son definitivamente "pseudo" métodos.
Si llama a estos métodos obtendrá un error. Esto se debe a que el propósito de Instrument es crear una interfaz pública para todas las clases derivadas de él.
La única razón para establecer esta interfaz común es que se puede representar de manera diferente para diferentes subtipos. Establece una forma básica para que podamos definir cosas que son "comunes" en todas las clases derivadas. Otra forma de ilustrar este concepto es llamar a Instrumento una "clase base abstracta" (clase abstracta para abreviar). Si desea manejar una serie de clases a través de esta interfaz pública, necesita crear una clase abstracta. Todos los métodos de clase derivada con una firma consistente con la declaración de clase base se pueden llamar a través del mecanismo de enlace dinámico (sin embargo, como se señaló en la sección anterior, si el nombre del método es el mismo que el de la clase base, pero los argumentos o parámetros son diferente, se producirá una sobrecarga, que puede no ser lo que queremos).
Si hubiera una clase abstracta como Instrumento, entonces es casi seguro que los objetos de esa clase no tendrían sentido. En otras palabras, la función del Instrumento es solo expresar la interfaz, no expresar algunos detalles de implementación específicos. Por lo tanto, no tiene sentido crear un objeto de instrumento y, en general, deberíamos impedir que los usuarios lo hagan. Para lograr esto, todos los métodos del instrumento pueden mostrar mensajes de error. Pero hacerlo retrasa la información hasta el tiempo de ejecución, lo que requiere pruebas exhaustivas y confiables por parte del usuario. De todos modos, la mejor manera es encontrar el problema durante la compilación.
Para resolver este problema, Java proporciona un mecanismo llamado "método abstracto". Es un método incompleto que contiene sólo una declaración y ningún cuerpo del método. La siguiente es la sintaxis utilizada al declarar métodos abstractos:
Abstract void X();
Una clase que contiene un método abstracto se llama clase abstracta. Si una clase contiene uno o más métodos abstractos, la clase debe designarse como abstracta. De lo contrario, el compilador nos informará un mensaje de error.
Si una clase abstracta está incompleta, ¿qué hará el compilador una vez que alguien intente generar un objeto de esa clase? Debido a que no es seguro crear un objeto que pertenezca a una clase abstracta, el compilador mostrará un mensaje de error. De esta manera, el compilador puede garantizar la "pureza" de la clase abstracta y no tenemos que preocuparnos por el mal uso.
Si heredas de una clase abstracta y deseas generar objetos de un nuevo tipo, debes proporcionar definiciones de métodos para todos los métodos abstractos en la clase base. Si no hace esto (puede optar por no hacerlo en absoluto), la clase derivada también será abstracta y el compilador nos obligará a marcar la naturaleza "abstracta" de esa clase con la palabra clave abstracta.
Una clase puede declararse como "clase abstracta" incluso si no contiene ningún método abstracto. Esta capacidad es útil si una clase no requiere ningún método abstracto y queremos deshabilitar todas las instancias de esa clase.
Malla/Interfaz
La palabra clave "interfaz" lleva el concepto abstracto a un nivel más profundo. Podemos pensar en ello como una clase puramente abstracta. Permite al creador especificar la forma básica de la clase: nombre del método, lista de parámetros y tipo de retorno, pero no el cuerpo del método. Las interfaces también contienen miembros de datos de tipos de datos básicos, pero son estáticos y finales de forma predeterminada. La interfaz solo proporciona un formulario y no proporciona detalles de implementación.
La interfaz se describe así: "Todas las clases que me implementan ahora deberían parecerse a mí". Por lo tanto, todo código que utiliza una interfaz específica sabe qué métodos puede llamar esa interfaz. De eso se tratan las interfaces. Por eso a menudo utilizamos interfaces para establecer un "acuerdo" entre clases. Algunos lenguajes de programación orientados a objetos utilizan una palabra clave llamada "protocolo", que hace lo mismo que una interfaz.
Para crear una interfaz, utilice la palabra clave interface en lugar de class. De manera similar a las clases, podemos agregar una palabra clave pública antes de la palabra clave de interfaz (pero solo la interfaz se define en un archivo con el mismo nombre u omitirla para crear un estado "amigable").
Para generar una clase que se ajuste a una interfaz específica (o conjunto de interfaces), utilice la palabra clave implements. Lo que queremos decir es "así es como se ve la interfaz, aquí están los detalles de cómo funciona".
Aparte de estos, nuestro otro trabajo es muy similar a la herencia.