子类的属性不可见

时间:2014-09-03 11:04:12

标签: c# .net inheritance properties

在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。我发现obj类型Parent没有这些成员,但我怎样才能在'清洁'中获得访问权限。办法?我可以做到以下几点:

Child obj = new Child();

..这会让我访问,但我经常看到正在制作的对象是父类而不是孩子。为什么这么常见?我是以错误的方式解决这个问题吗?

编辑:我应该说Child()中的属性对于从Parent()派生的所有类都不常见。

5 个答案:

答案 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()

}