我遇到了覆盖来自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"; }
}
}
在另一个类中我必须访问该属性,我不知道该对象此时是基类型还是子类
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将输出&#34;其他东西&#34; 但在这个特定的时刻,我不知道对象是什么类。 (我有10个不同的子类)。
我是否必须将所有对象投射到它的真实类?我在这个列表中有100-200个对象,并且有10个不同的类。或者还有其他方法吗?
任何帮助表示赞赏:)
答案 0 :(得分:9)
您应该在基类中创建属性实现virtual
,并将override
而不是new
放在派生类的实现上。这应该可以解决问题。
目前,唯一一个从界面Info
为属性Inf
提供实现的类是您的BaseClass
。根据您的代码,编译器认为派生类SubClass
引入了一个具有相同名称的新属性,这是合法的。只有在直接使用类而不是通过接口时才能访问此类属性。
答案 1 :(得分:4)
你做错了。请执行以下操作:
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)
答案 2 :(得分:3)
你已经通过“新”财产打破了链条。你需要覆盖它:
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"; }
}
}