我有一个基类和一个派生类。我在基类中调用一个函数(它有很多我想要重用的代码),它引用了我想在派生类中隐藏的私有变量。也就是说,我想调用基类方法并让它作用于派生类成员变量。私有成员是不同的类型,但派生自相同的类型。当我调用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的成员。
答案 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();
}
}