标签: inheritance-prevention

如何在C#中隐藏(删除)基类的方法?

问题的本质是,给定一个类层次结构如下:

class A
{
    protected void MethodToExpose()
    {}

    protected void MethodToHide(object param)
    {}
}

class B : A
{
    new private void MethodToHide(object param)
    {}

    protected void NewMethodInB()
    {}
}

class C : B
{
    public void DoSomething()
    {
        base.MethodToHide("the parameter"); // This still calls A.MethodToHide()
        base.MethodToExpose(); // This calls A.MethodToExpose(), but that's ok
        base.NewMethodInB();
    }
}
Run Code Online (Sandbox Code Playgroud)

如何防止从类"B"继承的任何类看到该方法A.MethodToHide()?在C++中,通过使用诸如的声明这很容易class B : private A,但是这种语法在C#中无效.

对于那些感兴趣的人(或者想知道我真正想做什么),我们要做的是为Rhino.Commons.NHRepository创建一个包装器,它隐藏了我们不希望暴露给我们的开发人员组的方法,因此我们可以采用千篇一律的方式开发我们的应用程序,新开发人员可以轻松遵循.所以是的,我相信"Is-A"测试对整个链(WidgetRepository Is-A BaseRepository Is-A NHRepository)是有效的.

编辑:我应该提到,为了论证,A类是我们控制范围之外的API类.否则问题变得相当容易.

c# inheritance language-features inheritance-prevention

18
推荐指数
4
解决办法
4万
查看次数

防止方法被继承

我有一个具体的基类Foo,包含30个与其子类相关的方法.

现在我遇到了一个仅针对基类的情况,我想创建一个无法继承的方法,这可能吗?

Class Foo 
{
   /* ... inheritable methods ... */

   /* non-inheritable method */
   public bool FooSpecificMethod()
   { 
      return true;
   } 
}

Class Bar : Foo
{
    /* Bar specific methods */
}

var bar = new Bar();
bar.FooSpecificMethod(); /* is there any way to get this to throw compiler error */
Run Code Online (Sandbox Code Playgroud)

编辑

我不确定我最初是否清楚.

我理解继承的原则,我理解Liskov替代原则.在这种情况下,只有一个例外处理"未继承"的情况,所以我不想创建一个'uninheritedFoo'子类.

我问在技术上是否可能创建一个foo.FooSpecificMethod()是有效且可公开访问的方法的情况,但是subclassoffoo.FooSpecificMethod()会抛出编译器错误.

基本上我想在一个未密封的课上使用密封方法.

c# inheritance-prevention

5
推荐指数
2
解决办法
6612
查看次数