我正在用C#编写一个控制台应用程序。
以下是代码:
interface ITest
{
string str { get; }
}
public class BaseClass : ITest
{
public virtual string str
{
get
{
return "BaseClass";
}
}
}
public class DerivedClass : BaseClass
{
public new string str {
get {
return "DerivedClass";
}
}
}
class Program
{
static void Main(string[] args)
{
ITest itest = new DerivedClass();
Console.WriteLine(itest.str);
Console.ReadKey();
}
}
当我执行上面的代码时," BaseClass"即将作为输出。相反,我如何得到" DerivedClass"作为输出?
答案 0 :(得分:8)
您需要override
虚拟财产而不是new
虚拟财产:
public override string str
{
get
{
return "DerivedClass";
}
}
答案 1 :(得分:4)
在派生类中使用new
声明属性时,您将创建一个新成员,该成员在通过接口调用时不会被调用。请改用override
。
答案 2 :(得分:3)
您可以使用dynamic
类型直接访问运行时类型。
Itest itest = new DerivedClass();
var str = ((dynamic)itest).str; // str == "DerivedClass"
如果您使用new
关键字而不是override
覆盖方法,则需要这样做。