2012-04-29 81 views
1
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; 

} 

但是编译器抱怨C#,从父引用访问子属性?

“父不包含定义为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 

现在我想删除所有的冗余代码,使一个巨大的函数可以处理所有这些。

+0

我已经回答最好,我可以给粗略的信息 - 如果你可以给你更多的上下文关于你想达到什么,那真的会有所帮助。 – 2012-04-29 08:09:41

+1

你如何使用关键字ref作为变量参数? – 2012-04-29 08:12:12

+0

@DarrenDavies编辑问题 – 2012-04-29 08:16:21

回答

4

如果所有子类必须具有的属性(但具有不同的实现),应声明它们作为在基类(Parent)摘要属性,然后在子类中实现它们。

如果一些派生类不会有这些属性,那么你会希望你的当前GetProps办?

编辑:如果您使用C#4你绝对不能得到较好的类设计(其中父类声明的属性),你可以使用动态类型:

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

我ð把它当作虽然不得已......

+0

对不起乔恩,我不是一个好作家,但是我在我的问题中增加了更多细节。此外,我正在访问此外部DLL,我没有访问来源。 – 2012-04-29 08:17:07

+0

@KevinBoyd:我怀疑这个子类是否有'override',除非这个属性实际上是在基类中的。如果你可以给一个简短的*完整的*例子,那真的会有所帮助。 – 2012-04-29 08:19:29

+0

乔恩,继承线很长。并且我使用了父级父级的引用,例如Parent ---> SubP10 ----> SubP9 ---> SubP8 ...-> Child。任何父母可能拥有prop1的定义。 – 2012-04-29 08:27:31

0

如果物业在父母和孩子之间的中间类定义的,您不必在设计时即中间类的引用,那么你可以使用反射来获取财产。但是这听起来像你应该使用最相关的子父代,而不是简单的父代。

+0

好主意!一个例子虽然有帮助!乔恩提到的反思和动态似乎是现有的选择。 – 2012-04-29 09:25:29

1

正如我从你的问题所理解的,你想从父类的对象访问子类成员。

OOP中不允许此行为。 Jon Skeet建议创建Abstract基类并在Children Classes中实现所需的成员。

其他方式轮可以是为所需的值分配给使用碱构建在派生类构造基类的成员。我不知道这会解决你的问题。但是,例如,考虑下面的代码片段:

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 名字:基地班

姓:基地班

名字:基地班

姓:派生类别

名称:基类

姓氏:派生类

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

+0

Pank,感谢您的解释,但在这种情况下,我正在访问一个外部库,无法修改源代码。另外我想从父引用访问子属性。进来的对象仍然是子对象。 – 2012-04-29 09:02:44

0

如果我理解正确的话,你( - 我假设Parent是一个基类,Child0Child1等继承。) - 你只是缺少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"; } } 
}