【问题标题】:How to hide the entire class?如何隐藏整个班级?
【发布时间】:2012-05-28 16:58:30
【问题描述】:

让我们想象一下:

// assembly 01

abstract class Foo
{
    abstract void Bar();
}
class AdvancedFoo : Foo
{
    override void Bar() { base.Foo(); ... }
}
sealed class SuperiorFoo : AdvancedFoo
{
    override sealed void Bar() { base.Foo(); }
}

然后我想从我的 02 asm 中引用该程序集 01 并替换中间基类(并且只有它),所以 SuperiorFoo 的实例是表现得好像他们继承了大会 02AdvancedFoo

// assembly 02

class AdvancedFoo : Foo
{
    override void Bar() { base.Foo(); ... }
}

如果 02 程序集不重写 SuperiorFoo 类声明,有什么方法可以做到这一点?

var supFoo = new SuperiorFoo();
supFoo.Bar(); // This one should call assembly 02's Bar();

【问题讨论】:

  • 请使用接口
  • 您的代码中没有错字吗?根据您的问题,我猜您的意思是让SuperiorFoo 继承AdvancedFoo 而不是Foo
  • 尝试这样做:“密封类SuperiorFoo:AdvancedFoo”

标签: c# class inheritance hide .net-assembly


【解决方案1】:

类型转发可以提供帮助:Type Forwarding in the Common Language Runtime

【讨论】:

    【解决方案2】:

    不是以你不做的方式,但你可以使用组合而不是继承来解决你的问题:

    interface IFoo
    {
        abstract void Bar();
    }
    class AdvancedFoo : IFoo
    {
        override void Bar() { base.Foo(); ... }
    }
    sealed class SuperiorFoo : IFoo
    {
        private IFoo _fooImplementer;
    
        public SuperiorFoo()
        {
            _fooImplemnter = new AbstractFoo();
        }
    
        public SuperiorFoo(IFoo fooImplementer)
        {
           _fooImplementer = fooImplementer;
        }
    
        void Bar() { _fooImplementer.Foo(); }
    }
    

    要从您的第二个程序集调用,您将使用第二个构造函数,传递您的新 'advancedfoo' 类的实例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-24
      • 1970-01-01
      • 1970-01-01
      • 2017-11-10
      相关资源
      最近更新 更多