从基类接口重写子类中的属性

本文关键字:属性 子类 重写 基类 接口 | 更新日期: 2023-09-27 18:22:08

我在覆盖来自接口的属性时遇到问题。我得到了一个实现接口的基类。这个类大约有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 other"但在这个特定的时刻,我不知道对象是什么类。(我有大约10个不同的子类)。

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

感谢任何帮助:)

从基类接口重写子类中的属性

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

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

您通过"new"属性打破了链。你需要覆盖它:

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

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

  • 使用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"; }
    }
}

结果正如你所料。

在这里阅读更多关于重写和多态性的信息:多态性(C#编程指南)