0

在基类中访问子类属性的最佳方法是什么。似乎如果我使用继承,我只需要依赖方法而不是属性[因为单独的类存在单独的属性集]。是否有任何推荐的安全方式从基类访问子类属性。或者这是重构代码的任何首选方式,以便我可以通过基类访问子类成员。我知道虚函数的使用,但我不知道如何使用它来设置子类成员变量的值。

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();
}
4

3 回答 3

1

当你想做这样的事情时,你应该提前知道你想让你的超类使用哪些属性。您可以在基类中将它们声明为受保护,以便您的子类可以根据自己的规则设置它们。

如前所述,您不能从基类访问孩子新声明的属性(如_def2_defin class )。Def

如果您实例化一个子类型并将其分配给一个超类型,例如Abc ab = new Def(),您决定将ab其视为Abc, 意思是,Def当您对ab. 确实,它ab确实是一个Def,但您必须将它作为一个Abc.

同样,如果您Def在函数中传递 a someFunction(Abc ab),则该函数更好地ab视为 a AbcsomeFunction(Abc ab)被创建来处理任何可能的子类型Abc,但只能通过它们在Abc.

于 2012-12-08T13:17:24.000 回答
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.
于 2012-12-31T13:57:43.093 回答
0

你可以试试:

var testDerived = (Derived)new Derived(); //casting to derived class required to access its members.

testBase.a = testDerived.b;
于 2017-03-30T15:50:32.330 回答