c# - 从基类接口(interface)覆盖子类中的属性

标签 c# .net interface

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

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

简化的示例代码:

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 个不同的类。还是有其他方法可以做到这一点?

感谢任何帮助:)

最佳答案

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

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

关于c# - 从基类接口(interface)覆盖子类中的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17613411/

相关文章:

c# - 一个类可以实现具有相同数据成员名称但类型不同的多个接口(interface)吗?

c# - 计算数字中数字出现次数的有效方法

c# - 如何实现惰性 TaskCompletionSource?

c# - 无法在 linq 内实例化哈希集

C# : make derived object conditionally share same base object

.net - 可视化大对象堆碎片

go - 在 golang 中,为什么我不能将结构用作嵌套结构类型?

.net - 在 Visual Studio 中使用 Com Interop 选项注册可以,但直接调用 Regasm 则不行

.net - 如何使用.net比较两个音轨的波形?

php - 如何动态加载php代码并检查类是否实现接口(interface)