如何在一个好的但多重继承的截肢语言如C#中解决"Must be MarshalByRefObject"?
问题非常简单,在某些情况下,您只需继承此类(基础结构要求).这在哪种情况下并不重要.那么,如果你已经从其他一些类(你的域模型要求)继承了,你会怎么做?
顺便说一句好的应用程序框架,就像spring.net一样,无论你需要在什么类型的基础架构中应用你的类,都要确保你不必继承这个类.
我想知道我在这里得到什么-3票?:)
通常,如果要在Remoting/WCF上下文中使用它,则只需要创建一个MarshalByRef对象.这通常是一个特殊的情况,它不是一个痛苦.
假设你有一个通用类型,你想从它派生并专门化它,然后远程派生类型 - 现在你有一个问题,因为要远程一个对象必须从MarshalByRefObject继承,你原来的一般类型没有.假设您无法更改它,因为您正在进行二进制继承,或者因为它本身派生自基类而无法更改?正如提问者指出的那样,由于C#(和.NET一般)不允许MI,因此不能从两者继承.
简短的回答是,你有点搞砸了.您可以将常规类型更改为MarshalByRefObject中的inhert(或者在链接上可以将其插入到有效的位置),或者您可以考虑使用代理对象进行混淆.
例如,您可以创建一个描述类型接口的接口契约,然后构建一个继承自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(); } }
看起来好像很多工作.最终,如果你在这种情况下,我建议重新设计或重新思考.