如何在一个好的但多重inheritance的截肢语言如C#中解决“Must be MarshalByRefObject”?

如何在一个好的但多重inheritance的截肢语言如C#中解决“Must be MarshalByRefObject”?

问题非常简单,在某些情况下,您只需inheritance此类(基础结构要求)。 这在哪种情况下并不重要。 那么,如果您已经从其他类(您的域模型要求)inheritance了,您会怎么做?

顺便说一句好的应用程序框架,就像spring.net一样,无论你需要在什么类型的基础架构中应用你的类,都要确保你不必inheritance这个类。

我想知道我在这里得到什么-3票? 🙂

通常,如果要在Remoting / WCF上下文中使用它,则只想创建一个MarshalByRef对象。 这通常是一个特殊的情况,它不是一个痛苦。

假设你有一个普通类型,你想从它派生并专门化它,然后远程派生类型 – 现在你有一个问题,因为要远程一个对象必须从MarshalByRefObjectinheritance,你原来的一般类型没有。 假设您无法更改它,因为您正在进行二进制inheritance,或者因为它本身派生自基类而无法更改? 正如提问者指出的那样,由于C#(和.NET一般)不允许MI,因此不能从两者inheritance。

简短的回答是你有点搞砸了。 您可以将常规类型更改为MarshalByRefObject中的inhert(或者在可以将其插入某个有效位置的链上移动得足够远),否则您可以考虑使用代理对象进行混淆。

例如,您可以创建一个描述类型接口的接口契约,然后构建一个inheritance自MarshalByRefObject的代理类型,该代理类型也通过组合和委托实现该类型的实例(即包装器)来实现该接口。 然后,您可以远程访问该代理类型的实例,该实例将实例化您的类型并按预期执行工作 – 但方法中的所有返回类型都必须是[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(); } } 

看起来好像很多工作。 最终,如果你在这种情况下,我建议重新设计或重新思考。

这取决于你需要如何实现它。 使用从MarshalByRefObject派生的基类可能会这样做。 聚合可能会这样做。 如果没有更具体的例子说明你需要它很难说,但很少有多重inheritance是解决问题的唯一方法。

您不能从多个类inheritance。 因此,您需要(a)更改inheritance层次结构,以便基础inheritance它,或者(b)以不同方式编写应用程序。

如果没有更多关于为什么需要inheritanceMarshalByRefObject或者为什么你的基类没有(不能?),那么很难给出更具体的建议。

但是我会说如果你的派生类型需要不同的编组语义到它的基础,那么你可能在某个地方遇到了一个架构问题。

“那么,如果你已经inheritance了其他一些类(你的领域模型要求),你会怎么做?”

您是否可以为需要从MarshalByRefObjectinheritance的域模型创建基类?

我使用通用方法取得了成功。 T不必是“MarshalByRefObject”。 当然,您必须将“RemoteProcess”替换为用于远程处理的对象。 然后,您可以将非MarshalByRefObject作为RemotingHost.RemoteObject访问。

 public class RemotingHost : 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)); } }