una sirve que poo polimorfismo para interfaces herencia ejemplos clases clase atributos abstractos abstractas abstracta c# inheritance static field abstract

sirve - C#clase abstracta herencia estática



polimorfismo c# (3)

Siento que me salté una clase de C # o dos, pero aquí está mi dilema:

Tengo una clase abstracta de la que derivo varias clases secundarias.

Estoy seguro de que para cada una de las clases secundarias tendré un constructor que necesita un determinado objeto estático como modelo y este objeto será diferente para cada una de las clases secundarias.

Mi primer enfoque fue hacer un objeto público estático en la clase padre abstracta y luego, antes de comenzar a crear instancias de las clases secundarias, lo modificaría para cada una de ellas, pero resulta que de esta manera solo hago una. objeto estático, para la clase abstracta, y cada una de sus clases secundarias lo usa.

¿Cómo podría resolver el problema?

Para ser más exactos, aquí está el pseudocódigo:

La clase abstracta padre:

abstract class AbstractClass { static public ModelObject Model; ... }

Una de las clases para niños:

class Child : AbstractClass { ... public Child() { this.someField = Model.someField; } }

EDITAR:

El modelo debe ser miembro de la clase "ModelObject", NO debe ser un singleton o cualquier otra cosa.

EDIT2:

Para ser aún más exactos, elegí esta implementación para un juego de ajedrez: tengo una clase abstracta para las piezas de ajedrez y las clases para niños representan las piezas concretas del juego: peones, caballeros, etcétera.

La clase abstracta se hereda de MeshMatObject, una clase que representa objetos 3d genéricos con la funcionalidad básica, como rotaciones, mallas, materiales, texturas, etc., y define métodos abstractos para piezas de juegos de ajedrez, como GetPossibleMoves ().

El objeto modelo del que hablé anteriormente es un miembro de MeshMatObject y, en mi opinión, debe definirse fuera de la clase solo una vez y luego usarse para todas las piezas. Quiero decir: por ejemplo, todos los peones tienen la misma malla y textura, por lo que no veo el punto de dar un modelo como parámetro cada vez que quieras hacer un peón.


¿Qué tal una fábrica para desacoplar sus clases de un modelo heredado?

public static class ModelObjectFactory { public static ModelObject GetModel<T>(T obj) { // return ModelObject according to type of parameter } } class Child { public Child() { ModelObject mo = ModelObjectFactory(this); this.someField = mo.someField; } }


Puede sortear el campo estático compartido haciendo su clase abstracta genérica. Cada clase genérica obtendrá su propia copia de los campos estáticos.

abstract class AbstractClass<T> { static public ModelObject Model; ... }

Luego, cada clase secundaria usará una instancia diferente del campo estático.

class Child : AbstractClass<Child> { ... public Child() { this.someField = Model.someField; } }

No importa que AbstractClass no haga referencia al parámetro genérico. Solo lo está utilizando para dar a cada clase secundaria una instancia única de la clase base.


Tiendo a usar algo similar a la solución de @ shf301. Dependiendo de sus necesidades, puede ser útil configurar la clase base como:

abstract class AbstractClass { } abstract class AbstractClass<TModel> : AbstractClass where TModel : ModelObject { static public TModel Model; ... }

Esto me permite una clase base común con la que puedo trabajar en funciones no genéricas. Esto también permite que los tipos derivados elijan el tipo de modelo exacto y pueden reducir la conversión.