una qué que programacion polimorfismo polimorfico instanciar herencia ejemplos clases clase c# inheritance constructor

c# - qué - que es una clase en programacion



C#- Hacer que todas las clases derivadas llamen al constructor de la clase base (4)

Tengo un personaje de la clase base que tiene varias clases derivadas de él. La clase base tiene varios campos y métodos.

Todas mis clases derivadas usan el mismo constructor de clase base, pero si no redefino el constructor en mis clases derivadas obtengo el error:

Error: Class "child class" no contiene un constructor que tome esta cantidad de argumentos

No quiero redefinir el constructor en cada clase derivada porque si el constructor cambia, tengo que cambiarlo en cada clase, lo cual, perdona cualquier malentendido, va en contra de la idea de solo escribir código una vez.


Debe redeclarar constructores, porque efectivamente no se heredan. Tiene sentido si piensas que los constructores son un poco como los métodos estáticos en algunos aspectos.

En particular, no querría que todos los constructores se heredaran automáticamente; después de todo, eso significaría que cada clase tendría un constructor sin parámetros, como lo hace el propio object .

Sin embargo, si solo quieres llamar al constructor de la clase base, no necesitas escribir ningún código en el cuerpo del constructor; solo pasa los argumentos hasta la clase base según la publicación de Waleed.

Si su clase base comienza a requerir más información, es natural que deba cambiar todas las clases derivadas, y de hecho cualquier cosa que llame a los constructores de esas clases, porque tienen que proporcionar la información. Sé que puede parecer un dolor, pero es solo una consecuencia natural de lo que hacen los constructores.


Puede usar la siguiente sintaxis para llamar al constructor de la clase base de las clases que derivan de él:

public DerivedClass() : base() { // Do additional work here otherwise you can leave it empty }

Esto llamará al constructor base primero, luego realizará cualquier declaración adicional, si la hay, en este constructor derivado.

Tenga en cuenta que si el constructor base toma argumentos, puede hacer esto:

public DerivedClass(int parameter1, string parameter2) : base(parameter1, parameter2) { // DerivedClass parameter types have to match base class types // Do additional work here otherwise you can leave it empty }

Puede encontrar más información sobre constructores en la siguiente página:

http://msdn.microsoft.com/en-us/library/ms173115%28VS.80%29.aspx


Tuve el mismo problema, y ​​lo resolví reemplazando mi constructor con un método de fábrica como este:

A es la clase de padres.

public static T getChild<T>(int number) where T:A, new() { T child = new T(); T._number = number; return child; }

Puede crear una clase Child con

Child b = A.getChild<Child>(2);


Un tipo de alternativa podría ser confiar en un contenedor de Inyección de Dependencia para inicializar sus objetos, de esa manera la referencia a la clase base (podría ser la llamada al constructor base u otro método de inicialización) se "externalizaría" al contenedor DI.

No sé si tiene sentido para su caso o no