method inherits inherited inherit c# multiple-inheritance marshalbyrefobject

inherits - ¿Cómo resolver "Debe ser MarshalByRefObject" en un lenguaje bueno pero con herencia múltiple amputada como C#?



inherited method c# (5)

"Entonces, ¿qué haces si ya has heredado de alguna otra clase (los requisitos de tu modelo de dominio)?"

¿Puedes crear una clase base para la pieza de tu modelo de dominio que requiere herencia de MarshalByRefObject?

¿Cómo resolver "Debe ser MarshalByRefObject" en un lenguaje bueno pero con herencia múltiple amputada como C #?

El problema es muy simple, en muchos casos solo tiene que heredar de esta clase (requisitos de infraestructura). No importa aquí realmente, qué casos. Entonces, ¿qué haces si ya has heredado de alguna otra clase (los requisitos de tu modelo de dominio)?

Por cierto, buenos marcos de aplicación, como spring.net, siempre se aseguran de que NO DEBES heredar de esta clase, sin importar qué tipo de infraestructura necesites aplicar a tu clase.

Me gustaría saber qué obtengo -3 votos aquí por? :)


Depende de cómo lo necesite. Usar una clase base que se deriva de MarshalByRefObject podría hacerlo. La agregación podría hacerlo. Sin un ejemplo más concreto de lo que necesita, es difícil decirlo, pero es un caso raro que la herencia múltiple sea la única solución a un problema.


No puedes heredar de múltiples clases. Entonces, usted necesita (a) cambiar su jerarquía de herencia para que la base herede de ella, o (b) escribir su aplicación de manera diferente.

Sin más información sobre por qué necesita heredar de MarshalByRefObject o por qué su clase base no (¿no puede?), Entonces es difícil dar un consejo más concreto.

Pero diría que si tienes un tipo derivado que necesita una semántica de cálculo diferente a su base, entonces es probable que tengas un problema arquitectónico en alguna parte.


En general, solo desea hacer un objeto MarshalByRef si va a usarlo en un contexto Remoting / WCF. Por lo general, este es un caso tan especial que no es doloroso.

Supongamos que tiene un tipo general, y quiere derivar de él y especializarlo, y luego remotamente el tipo derivado: ahora tiene un problema, porque para ser remoto un objeto debe heredar de MarshalByRefObject, y su tipo general original no . Supongamos que no puede cambiarlo porque está haciendo herencia binaria, o porque deriva de una clase base que no puede cambiar. Como señala el interlocutor, dado que C # (y .NET en general) no permite MI, no puede heredar de ambos.

La respuesta corta es que estás medio jodido. Cambie el tipo general a inhert desde MarshalByRefObject (o vaya lo suficientemente lejos de la cadena para que pueda insertarlo en algún lugar efectivo), o de lo contrario se le ocurriría rebuscar con objetos proxy.

Por ejemplo, podría crear un contrato de interfaz que describa la interfaz de su tipo y luego construir un tipo de proxy que herede de MarshalByRefObject que también implemente esa interfaz por composición y delegación a una instancia de su tipo (es decir, un contenedor). A continuación, podría remotamente una instancia de ese tipo de proxy que instanciaría su tipo y haría el trabajo como se esperaba, pero todos los tipos de retorno de los métodos deben ser [Serializable].

public interface IMyType { string SayHello(); string BaseTypeMethodIWantToUse(); } public class MyType : MyBaseType, IMyType { public string SayHello() { return "Hello!"; } } public class MyRemoteableType : MarshalByRefObject, IMyType { private MyType _instance = new MyType(); public string SayHello() { return _instance.SayHello(); } public string BaseTypeMethodIWantToUse() { return _instance.BaseTypeMethodIWantToUse(); } }

Parece mucho trabajo, sin embargo. En última instancia, si estás en este escenario, te sugiero un rediseño o un replanteamiento.


Tuve éxito con un enfoque genérico. T no tiene que ser "MarshalByRefObject". Por supuesto, tendrá que reemplazar "RemoteProcess" con el objeto que utiliza para la comunicación remota. Luego puede acceder a su no-MarshalByRefObject como RemotingHost.RemoteObject.

public class RemotingHost<T> : MarshalByRefObject where T: class { RemoteProcess host; T remoteObject; public T RemoteObject { get { return remoteObject; } } public RemotingAdmin() { host = new RemoteProcess(); remoteObject = (T)host.CreateObject(typeof(T)); } }