在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();
..我无法访问PropertyA
和PropertyB
。我发现obj
类型Parent
没有这些成员,但我怎样才能在'清洁'中获得访问权限。办法?我可以做到以下几点:
Child obj = new Child();
..这会让我访问,但我经常看到正在制作的对象是父类而不是孩子。为什么这么常见?我是以错误的方式解决这个问题吗?
编辑:我应该说Child()中的属性对于从Parent()派生的所有类都不常见。
答案 0 :(得分:1)
如果这些属性对于所有派生类型都是通用的,那么您应该在基类中声明它们。
如果它们是某些派生类型的常见内容,则将它们放入interface
并从派生类中实现该接口。
如果它们仅针对Child
类,那么您没有太多选择,要么将您的实例声明为Child
而不是Parent
,要么检查类型并正确投射它。< / p>
答案 1 :(得分:1)
我经常看到制作的对象是父类而不是孩子。为什么这么常见?
如果您不需要,请不要使用它。显然,您的Child
属性非常重要;然后将您的obj
声明为Child
,而不是Parent
。
相反,如果您实际上只关心Parent
成员,则使用Parent
声明。
如何以“干净”的方式访问它们?
通过施放:
Parent obj = new Child();
((Child)obj).PropertyA = "foo";
但不是每个Parent
都必须是Child
。
答案 2 :(得分:0)
在您的父类中声明属性,如下所示: -
public abstract class Parent()
{
public Parent() { }
public string PropertyA { get; set; }
public string PropertyA { get; set; }
}
更新: -
我建议将所有抽象类代码传递给一个接口,并在那里声明属性,并在子项中使用接口,无论你需要什么,并且如果主要关注于child,那么其他人在这里建议然后创建{{1而不是child
。
接口如下: -
parent
答案 3 :(得分:0)
您需要更改调用您的方法,如下所示 父obj = new Child(); - &GT;是你的
需要像这样`
Parent obj=new Parent(); or Child obj=new Child();
并在您的父类中更改类:
public string PropertyA { get; set; }
public string PropertyB { get; set; }
你基类中的需要有相同的方法。
并派生你的类需要像父类一样,这是第二种方法。
答案 4 :(得分:0)
您从Parent
定义了一个对象,但从new
定义了Child
该对象。因此,无论何时调用obj
的任何方法或属性,程序都会引用Parent
类来查找它们,但它无法在Parent
中找到这些属性,因为您没有&# 39; t覆盖它们。
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()
}