在基类中访问子类属性的最佳方法是什么。似乎如果我使用继承,我需要完全依赖于方法而不是属性[因为单独的类存在单独的属性集]。是否有任何建议的,安全的方法从基类访问子类属性。或者这是重构代码的首选方法,以便我可以通过基类访问子类成员。我知道虚函数的使用,但我不知道如何使用它来设置子类成员变量的值。
class Abc
{
public int Abc_1 {get;set;}
private int _abc;
virtual int DoCalculationonAbc(int a)
{
return abc_1 * a;
}
virtual void SetValueToPrivate(int a)
{
_abc = a;
}
}
class Def:Abc
{
private int _def;
private int _def2;
public int Def_2{get;set;} // what is the preferred way to set values this property
override public void SetValueToPrivate(int a)
{
_def = a;
//_def2 = ??
}
}
Main()
{
Abc ab = new Def();
}
答案 0 :(得分:1)
如果你想做这样的事情,你应该提前知道你希望超级课程有哪些属性。您可以在基类中将它们声明为受保护,以便子类可以根据自己的规则设置它们。
如前所述,您不能从基类访问子级新声明的属性(如类_def2
中的_def
和Def
)。
如果您实例化一个子类型并将其分配给超级类型,例如Abc ab = new Def()
,那么您决定将ab
视为Abc
,这意味着您放弃{当您对Def
执行操作时,{1}}具体的成员和功能。确实ab
确实是ab
,但您必须将其作为Def
来操纵。
同样,如果您在函数Abc
中传递Def
,则该函数会更好地将someFunction(Abc ab)
视为ab
。创建Abc
以处理someFunction(Abc ab)
可能的任何子类型,但仅限于Abc
中定义的公共属性和方法。
答案 1 :(得分:0)
无法从基类访问子类的成员,因为它不知道哪个类继承了它。接触子类成员的唯一方法是通过多态和向下转换来实现。
class Base{
public Base();
int a;
}
class Derived : Base{
public Derived();
public int b;
}
Base testBase = new Test;
Base testDerived = new Derived;
testBase.a = (Derived)testDerived.b; // Downcasting here.
答案 2 :(得分:0)
您可以尝试:
var testDerived = (Derived)new Derived(); //casting to derived class required to access its members.
testBase.a = testDerived.b;