从Baseclass接口覆盖子类中的属性

Kor*_*ryu 7 .net c# interface

我有一个覆盖来自接口的属性的问题.我有一个实现接口的基类.这个类有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"; }
   }

}
Run Code Online (Sandbox Code Playgroud)

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

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

foreach (BaseClass obj in listBase)
{
  Console.WriteLine(obj.Info);
}
Run Code Online (Sandbox Code Playgroud)

输出:

Something
Something
Run Code Online (Sandbox Code Playgroud)

想要输出:

Something
Something else
Run Code Online (Sandbox Code Playgroud)

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

我是否必须将所有对象投射到它的真实类?我在这个列表中有100-200个对象,并且有10个不同的类.或者还有其他方法吗?

任何帮助赞赏:)

das*_*ght 9

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

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


nvo*_*igt 6

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

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"; }
   }
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*zek 5

你这样做是错的。执行以下操作:

  • 使用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"; }
    }
}
Run Code Online (Sandbox Code Playgroud)

结果如你所料。

在此处阅读有关覆盖和多态的更多信息:多态(C# 编程指南)