隐藏基类成员

时间:2018-02-06 13:59:53

标签: c# inheritance override

我有一个基类和一个派生类。我在基类中调用一个函数(它有很多我想要重用的代码),它引用了我想在派生类中隐藏的私有变量。也就是说,我想调用基类方法并让它作用于派生类成员变量。私有成员是不同的类型,但派生自相同的类型。当我调用protected函数时,它引用基类私有成员,而不是派生类成员。我不想要这个。相反,我想调用baseclass方法并让它引用派生类成员。我如何定义一切来实现我想要的?

   public class Base
   {
       private Thing aThing;
       public base(){}

       protected doSomething()
       {
            Print( aThing.aMmebr)
        } 

    } 


    public class Deriv:Base
    {
       private AnotherThing aThing;

       public void DoIt()
        {
               doSomething ()

         }
    }

我想调用基类函数doSomething,我希望它打印一个AnotherThing的成员。

2 个答案:

答案 0 :(得分:2)

Base中的代码将在IL中输入,以使用键入的aThing - 所以:Thing。您可以virtual之类的属性中使用protected virtual aThing {get; set; },以便Deriv可以override该属性将其替换为不同的值/ implementation ,但是:您无法更改override中的类型 - 它仍然需要Thing。它可能是Thing子类,所以如果AnotherThing : Thing可行的话。

然而,听起来你应该真正制作整个doSomething方法protected virtual,并将派生类override 改为。类似的东西:

public class Base
{
    private Thing aThing;
    public Base() { }

    protected virtual void doSomething()
    {
        System.Console.WriteLine(aThing.aMmebr);
    }
}


public class Deriv : Base
{
    private AnotherThing anotherThing;

    protected override void doSomething()
    {
        System.Console.WriteLine(anotherThing.aMmebr);
    }
    public void DoIt()
    {
        doSomething();
    }
}

答案 1 :(得分:0)

您需要为aThing使用虚拟和覆盖属性。

public interface IHasString
{
    string aMember { get; }
}

public class Base
{
    protected virtual IHasString aThing { get; set; }

    public Base(){}

   protected void doSomething()
    {
        Console.WriteLine(aThing.aMember);
    }

}


public class Deriv : Base
{
   protected override IHasString aThing { get; set; }

   public void DoIt()
    {
        doSomething();

     }
}