如何解决“必须是MarshalByRefObject的”像C#中的好,但多重继承截肢语言?
-
10-07-2019 - |
题
如何解决“必须是MarshalByRefObject的”像C#中的好,但多重继承截肢语言?
这个问题很简单,在一些情况下,你就必须从这个类(基础设施的要求)继承。 这里并不重要真的,哪些案件。 所以,你会怎么做,如果您已经从其他类继承(域模型的要求)?
顺便说一句很好的应用框架,如spring.net始终确保你没有从这个类继承无论你需要应用到你的类什么样的基础设施。
我想知道我收到-3选票这里? :)强>
解决方案
在一般你只想做一个对象MarshalByRef如果你打算在一个远程处理/ WCF上下文中使用它。这通常是一个特殊的,足够的情况下,它不是一个痛苦。
假设你有一个一般的类型,你想从中得到和专门它,然后远程派生类型 - 现在你有一个问题,因为要远程处理的对象必须从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();
}
}
好像大量的工作,虽然。最后,如果你在这种情况下是我建议重新设计或重新考虑。
其他提示
这取决于你需要如何得到它。使用自MarshalByRefObject派生的基类可能做到这一点。聚集可能做到这一点。如果没有你需要的东西很难说,但它是一个罕见的情况下多重继承将是一个问题的唯一解决方案更具体的例子。
您不能从多个类继承。所以,你要么需要(一)更改您的继承层次的,因此基本从它继承,或(b)不同的编写应用程序。
无约的为什么的你需要从MarshalByRefObject
或为什么你的基类不继承的更多信息(可以不?),那么它很难给任何更具体的建议。
不过,我会说,如果你有一个派生类型需要不同的编组语义的基础上,那么你可能已经得到一个建筑问题的地方。
“那么,你会怎么做,如果您已经从其他类(域模型的要求)遗传吗?”
您可以创建一个基类为这块领域模型中,需要继承自MarshalByRefObject?
我有一个通用的方法成功。 T没有被“MarshalByRefObject的”。当然,你必须与你使用的远程对象,以取代“RemoteProcess”。然后你就可以访问你的非MarshalByRefObject的作为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));
}
}