simple multiple miembro implementacion implementa herencia heredado hacer como clases abstracto abstractas c# class inheritance interface multiple-inheritance

miembro - implementacion de herencia multiple en c#



Herencia mĂșltiple (4)

C # no es compatible con herencia múltiple de clases (pero admite implementaciones múltiples de interfaces).

Lo que estás pidiendo no es herencia múltiple. La herencia múltiple es cuando una sola clase tiene más de una clase base. En su ejemplo, cada clase hereda de una / cero otras clases. Asset y Server son las mejores clases base. Así que no tiene ningún problema para hacerlo en c #, puede definir la funcionalidad común en, por ejemplo, el servidor y luego hacer cosas diferentes en el dispositivo virtual y en el dispositivo físico .

Sin embargo, terminará con una jerarquía de clases posiblemente compleja y muchas personas recomendarían la composición sobre la herencia . Aquí es donde tendrías interfaces que definen el comportamiento y las clases implementan la interfaz para decir que hacen algo pero cada clase puede implementar los métodos de interfaz de manera diferente. Entonces su ejemplo para las interfaces de PhysicalServer puede ser alentado.

He buscado en línea información que me ayudaría a resolver un problema de diseño que me está confundiendo. Soy nuevo en situaciones de herencia complicadas, por lo que mi solución podría enraizarse en un mejor diseño. Pero al tratar de descubrir cuál debería ser mi diseño, sigo pensando que realmente solo necesito heredar más de 1 clase base.

Mi caso específico involucra activos y diferentes tipos de activos.

Comenzando con el activo ...

Cada dispositivo físico es un activo
Cada dispositivo virtual es un activo
Cada servidor es un activo

Cada servidor físico necesitaría ser un dispositivo físico y un servidor
Cada VirtualServer necesitaría ser un Dispositivo Virtual y un Servidor
Cada NetDevice es un dispositivo físico
Cada StorageArray es un dispositivo físico

Supongo que una solución es duplicar el código del Servidor para los Servidores Físicos y los Servidores Virtuales; sin embargo, creo que esto va en contra de lo que trato de hacer, que es heredar.

Deben ser clases separadas porque cada uno de los tipos tendrá propiedades y métodos. Por ejemplo, el Servidor tendrá OSCaption, Memory, Procs, etc. PhysicalDevice tendrá cosas como Location, Serial, Vendor etc. Y VirtualDevice tendrá un ParentDevice, State, VHDLocation, etc.

Si la herencia es un liner, entonces me encuentro con el problema de no poder describir estos tipos con precisión.

Algo que parece intrigante es Interfaces. Parece que puedo definir todas las clases base como interfaces e implementarlas en mis clases principales según sea necesario. pero, simplemente no estoy seguro de cuáles son las implicaciones si tuviera que hacer eso.

por ejemplo, algo así como ... PhysicalServer : IAsset : IServer : IPhysical

Estoy en aguas profundas, así que solo estoy buscando sugerencias u orientación.


Las interfaces son una forma adecuada de garantizar la integridad de los contratos en todos los tipos, pero puede terminar con un código duplicado para cada implementación.

Su escenario puede prestarse mejor a la composición que a la herencia (o una combinación de los mismos).

Ejemplo - Herencia + Composición

public class PhysicalServer : Asset { public PhysicalInfo PhysicalProperties { get; set; } } public class VirtualServer : Asset { public VirtualInfo VirtualProperties { get; set; } }

Ejemplo: solo composición

public class VirtualServer { public VirtualInfo VirtualProperties { get; set; } public AssetInfo AssetProperties { get; set; } }

Luego puede agregar polimorfismo / genéricos en la mezcla y crear derivados de tipos para representar necesidades más específicas.

Ejemplo - Herencia + Composición + Miembro genérico que hereda de un tipo común

public class VirtualServer<TVirtualInfo> : Asset where TVirtualInfo : VirtualDeviceInfo { public TVirtualInfo VirtualProperties { get; set; } } public class VirtualServerInfo : VirtualDeviceInfo { // properties which are specific to virtual servers, not just devices }

Hay innumerables formas en que puede modelar esto, pero armado con interfaces, composición, herencia y genéricos, puede obtener un modelo de datos efectivo.


Para empezar, recuerde que la herencia es el resultado obvio del tipo de problema que ha mencionado. Cada clase tiene más de un comportamiento y todos caen en esta trampa. Así que relájate Tú no eres el primero ni el último.

Debes modificar tu forma de pensar para alejarte de la norma.

Debes mirarlo desde el ángulo de lo que "cambia" en el futuro en lugar de mirar un tipo jerárquico de diagrama de clases. Un diagrama de clases puede no ser jerárquico, sino que debe representar "qué cambios" y qué "permanece constante". Por lo que veo, en el futuro puede definir un Dispositivo Móvil, Dispositivo VirtualMobile.

En sus clases actuales parece que tiene propiedades como Proveedor, Serie. Estos también pueden ser necesarios en MobileDevice ¿verdad? Por lo tanto, necesita modificar su forma de pensar para pensar realmente en comportamientos en lugar de clases que tengan un sentido jerárquico.

Repensar, usted está yendo por la pista de la herencia múltiple, diseño muy peligroso y complejo. No es la corrección de su proceso de pensamiento lo que está en cuestión aquí. Es cuestión de que codifiques algo y alguien adelante en el futuro cercano lo complicará más allá de toda reparación.

Ninguna herencia múltiple en Java existe por esta única razón, para garantizar que no piense de manera jerárquica.

Piensa en "fábricas" (para creación), estrategia (para funcionalidad / procesamiento común).

Editado:

De hecho, también debería considerar la creación de capas en forma de biblioteca, de modo que haya una abstracción y control completos en las partes principales de su procesamiento. Todo lo que pretendas hacer con la clase Activo / Dispositivo debe resumirse en una biblioteca, que puede protegerse mediante un cambio.


Use mixins.

Primero decides cuál es la principal cosa que quieres que sea tu objeto. En tu caso, creo que debería ser servidor.

public class PhysicalServer : Server

Luego agrega interfaces para las otras funcionalidades.

public class PhysicalServer : Server,IAsset,IVirtualDevice

Y agrega métodos de extensión a las interfaces.

public static int WordCount(this IAsset asset) { //do something on the asset }

Aquí hay un artículo sobre mixins en caso de que mi respuesta sea demasiado simple: http://www.zorched.net/2008/01/03/implementing-mixins-with-c-extension-methods/