隐藏.Net层次结构中的方法

时间:2013-04-26 12:37:04

标签: c# inheritance

我有3个班级:

  1. BaseClass的
  2. 继承自BaseClass的Middleclass
  3. ClientClass继承Middleclass
  4. 我想知道如何在BaseClass中隐藏方法以不出现在ClientClass中?

    示例:

    public class BaseClass
    {
        public void BaseMethod1()
        {
        }
    
        public void BaseMethod2()
        {
        }
    }
    
    public class MiddleClass : BaseClass
    {
        public void MiddleMethod()
        {
            this.BaseMethod1();
        }
    }
    
    public class ClientClass : MiddleClass
    {
        public void Test()
        {
            this.MiddleMethod();
            this.BaseMethod1(); // I can't see this method here
        }
    }
    

    编辑:我修改了我的样本,我把“this.BaseMethod1();”在MiddleClasse

4 个答案:

答案 0 :(得分:4)

您需要将该方法定义为私有。仅供参考,您可以在此处获得有关访问修饰符的更多信息

  

public :类型或成员可以由同一程序集中的任何其他代码或引用它的其他程序集访问。

     

private :只能通过同一个类或结构中的代码访问类型或成员。

     

protected :类型或成员只能由同一个类或结构中的代码访问,或者在从该类派生的类中访问。

     

内部:类型或成员可以由同一程序集中的任何代码访问,但不能从其他程序集访问。

答案 1 :(得分:4)

我一直认为,如果你想隐藏一些基类中的某些功能,而不是所有派生类,那么它就是code smell,你的设计需要重新思考。

答案 2 :(得分:2)

试试这个,这打破了直接继承树:

public interface IBaseClass
{
    void BaseMethod1();
    void BaseMethod2();
}

public class BaseClass : IBaseClass
{
    public void BaseMethod1()
    {
    }

    public void BaseMethod2()
    {
    }
}

public class MiddleClass : IBaseClass
{
    BaseClass @base;

    public MiddleClass() { this.@base=new BaseClass(); }

    public void MiddleMethod()
    {
        @base.BaseMethod1();
    }

    void IBaseClass.BaseMethod1()
    {
        //@base.BaseMethod1();
        throw new NotImplementedException();
    }

    public void BaseMethod2()
    {
        @base.BaseMethod2();
    }
}

public class ClientClass : MiddleClass
{
    public void Test()
    {
        this.MiddleMethod();
        // 'ClientClass' does not contain a definition for 'BaseMethod1'
        //this.BaseMethod1(); 
    }
}

答案 3 :(得分:0)

将方法BaseMethod1定义为BaseClass中的受保护,而不是在MiddleClass中使用函数BaseMethod1。

public class BaseClass
{
    protected void BaseMethod1()
    {
    }

    public void BaseMethod2()
    {
    }
}

public class MiddleClass : BaseClass
{
    public void MiddleMethod()
    {
       base.BaseMethod1();
    }
    // hide method
    private new void BaseMethod1()
    {

    }
}