C#,从父引用访问子属性?

时间:2012-04-29 08:06:08

标签: c# inheritance

public void GetProps(Parent p){

   // want to access lots of child properties here
   string childProp1 = p.prop1;
   bool childProp2 = p.prop2;
   bool childProp3 = p.prop3;

}

然而编译器抱怨

  

“父级不包含定义prop1”

该函数将采用Class Parent的不同子类型。

所有子类都有此

public override string prop1 { get; set; }

有没有办法实现这个目标?

修改 使问题更清楚

我目前有一个巨大的if-elseif,我做的事情就像

if(p is Child0){
      Child0 ch = p as Child0; 

       // want to access lots of child properties here
       string childProp1 = ch.prop1;
       bool childProp2 = ch.prop2;
       bool childProp3 = ch.prop3;

}else if(p is Child1){
      Child1 ch = p as Child1; 

       // want to access lots of child properties here
       string childProp1 = ch.prop1;
       bool childProp2 = ch.prop2;
       bool childProp3 = ch.prop3;

}else if(...// and many more 

现在我想删除所有冗余代码并创建一个可以处理所有这些的函数。

5 个答案:

答案 0 :(得分:4)

如果所有子类都需要具有属性(但具有不同的实现),则应在基类中将它们声明为 abstract 属性(Parent ),然后在子类中实现它们。

如果某些派生类不具备这些属性,那么您希望当前的GetProps做什么?

编辑:如果你正在使用C#4并且肯定无法获得更好的类设计(父类声明属性),你可以使用动态类型:

public void GetProps(Parent p) {
    dynamic d = p;
    string childProp1 = d.prop1;
    bool childProp2 = d.prop2;
    bool childProp3 = d.prop3;
    // ...    
}

我认为这是最后的手段......

答案 1 :(得分:1)

正如我从您的问题中所理解的那样,您希望从父类的对象访问子类成员。

OOP中不允许此行为。 一种方法可以是Jon Skeet建议创建一个抽象基类并在子类中实现所需的成员。

其他方式可以是使用基本构造将所需值分配给派生类构造函数中的基类成员。我不知道这会解决你的问题。但请考虑以下代码段:

 public class BaseClass
{
    public string FirstName = "Base Class";
    public string LastName = "Base Class";
}

public class DerivedClass : BaseClass
{
    public DerivedClass()
    {
        base.LastName = "Derived Class";
    }
}

internal class Tester
{
    private static void Main(string[] args)
    {
        BaseClass objBaseClass = new BaseClass();
        Console.WriteLine("First Name : " + objBaseClass.FirstName);
        Console.WriteLine("Last Name : " + objBaseClass.LastName);

        DerivedClass objDerivedClass = new DerivedClass();
        Console.WriteLine("First Name : " + objDerivedClass.FirstName);
        Console.WriteLine("Last Name : " + objDerivedClass.LastName);

        BaseClass objBaseDerivedClass = new DerivedClass();
        Console.WriteLine("First Name : " + objBaseDerivedClass.FirstName);
        Console.WriteLine("Last Name : " + objBaseDerivedClass.LastName);

        Console.ReadKey();
    }
}

O / P 名字:基类

姓氏:基类

名字:基类

姓氏:派生类

名字:基类

姓氏:派生类

如果有帮助,请告诉我。

答案 2 :(得分:1)

如果有人需要解决方案,只需将您收到的课程作为参考投射,如下所示:

public void GetProps(Parent p){
..
  string childProp1 = ((ChildClass)p).prop1;   
...
}

答案 3 :(得分:0)

如果属性是在父级和子级之间的中间类中定义的,并且在设计时没有对该中间类的引用,那么可以使用反射来获取属性。但听起来你应该使用最相关的子父而不仅仅是父母。

答案 4 :(得分:0)

如果我理解正确( - 我假设ParentChild0 Child1等继承的基类。) - 你只是缺少{{{ 1}}在父母中。它不会妨碍它,它只会被覆盖。

查看此示例(返回“子字符串”),并注意prop1传递给期望child实例的方法。

ParentClass