【问题标题】:Override Property in Subclass from Baseclass Interface从基类接口覆盖子类中的属性
【发布时间】:2013-07-12 10:59:33
【问题描述】:

我遇到了覆盖来自接口的属性的问题。我有一个实现接口的基类。这个类有大约 10 个子类。在某些情况下,子类应该覆盖来自接口的属性。

我的问题是,我在不知道对象具有什么类型的类的情况下访问属性,并且对象总是返回基类属性值而不是覆盖的子类属性值。

示例代码简化:

public interface Inf
{
   string Info
   {
     get;      
   }
}


public class BaseClass : Inf
{

   public string Info
   {
      get { return "Something"; }
   }

}


public class SubClass : BaseClass 
{

   new public string Info
   {
      get { return "Something else"; }
   }

}

在另一个类中我必须访问该属性,我现在不知道该对象是基类还是子类

List<BaseClass> listBase = new List<BaseClass>();
listBase.Add(new BaseClass());
listBase.Add(new SubClass());

foreach (BaseClass obj in listBase)
{
  Console.WriteLine(obj.Info);
}

输出:

Something
Something

想要的输出:

Something
Something else

((SubClass)obj).Info 会输出“Something else” 但是在这个特定的时刻,我不知道该对象是什么类。 (我有大约 10 个不同的子类)。

我必须将所有对象都转换为它的真实类吗?我在这个列表中得到了大约 100-200 个对象,并围绕 10 个不同的类。或者有没有其他方法可以做到这一点?

任何帮助表示赞赏:)

【问题讨论】:

  • 覆盖/虚拟方法能解决您的问题吗?
  • 谢谢,这样可以正常工作:)

标签: c# .net interface


【解决方案1】:

您应该在基类中创建属性实现virtual,并在派生类的实现中使用override 而不是new。这应该可以解决问题。

目前,从接口Inf 提供属性Info 实现的唯一类是您的BaseClass。根据您的代码,编译器认为派生类SubClass 引入了一个同名的新属性,这是合法的。只有当您直接使用类而不是通过接口时,才能访问此类属性。

【讨论】:

    【解决方案2】:

    你已经通过“新建”属性打破了链条。您需要覆盖它:

    public interface Inf
    {
       string Info
       {
         get;      
       }
    }
    
    public class BaseClass : Inf
    {
       public virtual string Info
       {
          get { return "Something"; }
       }
    }
    
    public class SubClass : BaseClass 
    {    
       public override string Info
       {
          get { return "Something else"; }
       }
    }
    

    【讨论】:

      【解决方案3】:

      你做错了。执行以下操作:

      • 使用virtual关键字声明基类属性
      • 在子类属性声明旁边添加override关键字
      public class BaseClass : Inf
      {
          public virtual string Info
          {
              get { return "Something"; }
          }
      }
      
      
      public class SubClass : BaseClass
      {
          public override string Info
          {
              get { return "Something else"; }
          }
      }
      

      结果如你所愿。

      在此处阅读有关覆盖和多态性的更多信息:Polymorphism (C# Programming Guide)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-05
        • 1970-01-01
        • 2019-10-13
        相关资源
        最近更新 更多