what una two qué que programacion polimorfismo polimorfico objetos multiple metodos inherit hijo herency herencia heredado hereda from form ejercicios ejemplos ejemplo derivadas derivada crear creacion constructores classes clases clase another c# inheritance oop

una - what is inheritance c#



¿Por qué los constructores no son heredados? (5)

El constructor predeterminado siempre será llamado.

class Bar : Foo { }

Cuando se crea una instancia de Bar llamará al constructor Foo () de forma predeterminada.

class Foo { public Foo(int someVar) {} } class Bar : Foo { public Bar() : base(42) {} }

Si no hay un constructor sin parámetros, se le pedirá que defina cuál usar y pasar los parámetros.

Supongo que hay algo realmente básico sobre la herencia de C # que no entiendo. ¿Alguien podría iluminarme?


En ocasiones, al crear subclases, desea restringir las condiciones requeridas para crear una instancia de la clase.

Dejame darte un ejemplo. Si las clases heredaran sus constructores de superclase, todas las clases tendrían el constructor sin parámetros de Object . Obviamente eso no es correcto.


Se llaman constructores en superclases, ya sea que los invoques explícitamente o no. Cadena de la clase padre hacia abajo. Si su constructor no llama explícitamente a un constructor en su superclase, el constructor predeterminado en esa clase se llama implícitamente antes que el código de su constructor.


Si piensa en lo que sucedería si los constructores fueran heredados, debería comenzar a ver el problema.

Como casi todos los tipos en .NET heredan de Object (que tiene un constructor sin parámetros), eso significa que casi todos los tipos que crees estarían obligados a tener un constructor sin parámetros. Pero hay muchos tipos en los que un constructor sin parámetros no tiene sentido.

También habría un problema con el control de versiones. Si aparece una nueva versión de tu tipo base con un nuevo constructor, obtendrías automáticamente un nuevo constructor en tu tipo derivado. Esto sería algo malo, y una instancia específica del problema de la clase base frágil .

También hay un argumento más filosófico. La herencia se trata de responsabilidades tipo (esto es lo que hago). Los constructores se basan en la colaboración de tipos (esto es lo que necesito). Entonces, los constructores heredadores estarían mezclando la responsabilidad del tipo con la colaboración del tipo, mientras que esos dos conceptos realmente deberían permanecer separados.


Supongo que quieres decir:

class Foo { public Foo(int someVar) {} } class Bar : Foo { // Why does Bar not automatically have compiler generated version of Bar(int someVar): Foo(someVar) {} }

Creo que esto se hereda de C ++ (y Java).
Pero suponiendo que tuvieras esto y Bar tuviera algunas otras variables miembro. ¿Esto no introduciría la posibilidad de que el constructor generado por el compilador sea usado de forma intencionada y no inicialice los miembros de BAr?