2014-09-03 120 views
0

在C#4.0中我有一个父类和子类,与此类似:属性不可见

public abstract class Parent() 
{ 
    public Parent() { } 

    public void CommonMethod() { /* do something */ } 
} 

public class Child : Parent 
{ 
    public string PropertyA { get; set; } 
    public string PropertyA { get; set; } 

    public Child() : base() 

} 

如果我实例如下:

Parent obj = new Child(); 

..我不能可以访问PropertyAPropertyB。我意识到objParent类型,它没有这些成员,但我怎样才能以“干净”的方式访问它们?我能做到以下几点:

Child obj = new Child(); 

..这会给我的访问,但我经常看到的物体正在取得被输入到父,而不是孩子。为什么这很常见?我是否以这种错误的方式去做?

编辑:我应该说,Child()中的属性不是所有派生自Parent()的类都通用的。那些在你的父类有产者的

回答

1

如果这些特性是所有派生类型常见,那么你应该在基类中声明它们。

如果他们是一些派生类型,然后把它们放入interface并从您的派生类实现该接口。

如果它们只针对Child类,那么您没有太多选择,要么将您的实例声明为Child而不是Parent,或者检查类型并进行适当的转换。

+0

他们不常见;我应该说明这一点。问题已更新。 – 2014-09-03 11:06:43

0

补充声明,如下图所示: -

public abstract class Parent() 
{ 
    public Parent() { } 
    public string PropertyA { get; set; } 
    public string PropertyA { get; set; } 
} 

更新: -

我建议所有的抽象类代码传送到一个接口并有声明的属性并在任何需要的地方使用儿童界面,并按照其他人在此提出的建议,如果主要重点放在儿童上,则请制作child的实例,而不是parent

接口将如下: -

public interface IParent 
{ 
    // interface members 
     string PropertyA { get; set; } 
     string PropertyA { get; set; } 
} 
+0

的问题是,PropertyA&PropertyB不常见于母公司所有的孩子。 – 2014-09-03 11:07:12

+0

你的意思是一些孩子有那些合适的人,有些人不正确? @ John'Mark'Smith – Neel 2014-09-03 11:08:03

1

我经常看到制作的对象是父类而不是子类型。为什么这很常见?

如果你不需要它,请不要使用它。显然你的Child属性是重要的;然后宣布您的objChild,而不是Parent

反过来,如果您只关心Parent成员,则可以使用Parent声明。

我怎样才能以'干净'的方式访问他们?

铸造:

Parent obj = new Child(); 
((Child)obj).PropertyA = "foo"; 

但并不是每一个Parent必须是一个Child

0

你需要改变调用你的方法如下
父obj = new Child(); - >是你

需要是这样的`

Parent obj=new Parent(); or Child obj=new Child(); 

,并在你的父类改变类是这样的:

public string PropertyA { get; set; } 


public string PropertyB { get; set; } 

在你的基类需要有同样的方法。

并派生你的类需要像父类一样这是第二种方法。

0

您从Parent中定义了一个对象,但是它从Child中定义了一个对象,但它是new。因此,无论何时调用obj的任何方法或属性,程序都会参考Parent类来查找它们,但由于您没有覆盖它们,因此无法在Parent中找到这些属性。

public abstract class Parent() 
{ 
    public Parent() { } 

    public void CommonMethod() { /* do something */ } 

    abstract public PropertyA {get; set;} 
    abstract public PropertyB {get; set;} 
} 

public class Child : Parent 
{ 
    override public string PropertyA { get; set; } 
    override public string PropertyA { get; set; } 

    public Child() : base() 

}