当前位置:  开发笔记 > 编程语言 > 正文

如何在一个好的但多重继承的截肢语言如C#中解决"Must be MarshalByRefObject"?

如何解决《如何在一个好的但多重继承的截肢语言如C#中解决"MustbeMarshalByRefObject"?》经验,为你挑选了1个好方法。

如何在一个好的但多重继承的截肢语言如C#中解决"Must be MarshalByRefObject"?

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

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

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



1> Neil Hewitt..:

通常,如果要在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();
    }
}

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

推荐阅读
落单鸟人
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有