4
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”

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

所有的子类都有这个

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 

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

4

5 回答 5

7

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

如果某些派生类没有这些属性,那么您希望您的 currentGetProps做什么?

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

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

不过,我会把这当作最后的手段......

于 2012-04-29T08:08:36.363 回答
4

万一有人需要它的解决方案,只需将您收到的类转换为参考,如下所示:

public void GetProps(Parent p){
..
  string childProp1 = ((ChildClass)p).prop1;   
...
}
于 2018-05-30T09:51:00.747 回答
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 名字:基类

姓氏:基类

名字:基类

姓氏:派生类

名字:基类

姓氏:派生类

让我知道,如果它有帮助。

于 2012-04-29T08:53:14.697 回答
0

如果我对您的理解正确(-我假设Parent它是 etc 继承的基类Child0 Child1。)-您只是缺少prop1父级中的声明。它不会妨碍它,它只会被覆盖。

查看此示例(返回“子字符串”)并注意child传递给需要ParentClass实例的方法。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        ChildClass child = new ChildClass();
        Text = ParentClass.mymethod(child);
    }
}

class ParentClass
{
    public virtual string s { get { return "parent string"; }  }

    public static string mymethod(ParentClass parent)
    {
        return parent.s;
    }
}

class ChildClass : ParentClass
{
    public override string s { get { return "child string"; }  }
}
于 2012-04-29T11:44:04.630 回答
0

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

于 2012-04-29T08:44:55.140 回答