【问题标题】:Properties of child class not visible子类的属性不可见
【发布时间】:2014-10-27 20:34:56
【问题描述】:

在 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() 的类都通用。

【问题讨论】:

    标签: c# .net inheritance properties


    【解决方案1】:

    如果这些属性对于所有派生类型都是通用的,那么您应该在基类中声明它们。

    如果它们对于 一些 派生类型很常见,则将它们放入 interface 并从派生类中实现该接口。

    如果它们仅特定于 Child 类,那么您别无选择,要么将您的实例声明为 Child 而不是 Parent,要么检查类型并适当地进行转换。

    【讨论】:

    • 它们并不常见;我应该说明这一点。问题已更新。
    【解决方案2】:

    我经常看到正在制作的对象是键入给父级而不是子级的。为什么这种情况如此普遍?

    如果您不需要它,请不要使用它。显然你的Child 属性很重要;然后将您的obj 声明为Child,而不是Parent

    相反,如果您实际上只关心Parent 成员,则使用Parent 声明。

    我怎样才能以“干净”的方式访问它们?

    通过铸造:

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

    但并非每个Parent 都必须是Child

    【讨论】:

      【解决方案3】:

      在你的父类中声明那些属性,如下所示:-

      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; }
      }
      

      【讨论】:

      • 问题是PropertyA和PropertyB并不是Parent的所有孩子都通用的。
      • 你的意思是有些孩子有这些属性,有些没有? @约翰马克史密斯
      【解决方案4】:

      您从Parent 定义了一个对象,但new 它是从Child 定义的。因此,每当您调用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()
      

      }

      【讨论】:

        【解决方案5】:

        您需要更改调用方法,如下所示
        父 obj = new Child(); -> 是你的

        需要这样`

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

        在你的父类中改变类是这样的:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-03-04
          • 2011-03-02
          • 2013-06-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多