gpt4 book ai didi

c# - 如何用像 C# 这样好的但多继承截肢的语言解决 "Must be MarshalByRefObject"?

转载 作者:可可西里 更新时间:2023-11-01 03:00:55 25 4
gpt4 key购买 nike

如何在像 C# 这样的多继承截断语言中解决“必须是 MarshalByRefObject”?

问题很简单,在某些情况下你只需要继承这个类(基础设施要求)。在这里真的无关紧要,哪种情况。那么,如果您已经从其他类(您的域模型要求)继承了该类,您会怎么做?

顺便说一句,好的应用程序框架,如 spring.net,总是确保您不必继承此类,无论您需要将哪种基础架构应用于您的类。

我想知道为什么我在这里得到 -3 票?? :)

最佳答案

一般来说,如果您要在远程处理/WCF 上下文中使用它,您只想创建一个对象 MarshalByRef。这通常是一种足够特殊的情况,不会造成痛苦。

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

简短的回答是你有点搞砸了。您要么将一般类型更改为从 MarshalByRefObject 继承(或者在链上走得足够远,以便可以将其插入有效的位置),要么您可以考虑使用代理对象进行处理。

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

虽然看起来工作量很大。最后,如果您遇到这种情况,我建议您重新设计或重新考虑。

关于c# - 如何用像 C# 这样好的但多继承截肢的语言解决 "Must be MarshalByRefObject"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/313243/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com