在此处运行:http://rextester.com/ZMLMB2576
public interface IClass {
int number {get;}
}
public abstract class BaseClass : IClass {
public BaseClass(int n){
number = n+100;
}
public int number { get;set;}
}
public class DerivedClass : BaseClass {
public DerivedClass(int n) : base(n) {
number = n;
}
public int number { get;set;}
}
public class Program
{
public static void Main(string[] args)
{
var foobar = new DerivedClass(1);
Console.WriteLine(GetNumber(foobar)); // 101
}
public static int GetNumber(IClass foo){
return foo.number;
}
}
为什么函数GetNumber
不使用派生类最多的类,而只将传递的对象视为BaseClass?
如果它将传递的对象(foo)视为DerivedClass,那么我怀疑基本构造函数首先运行,然后运行DerivedClass构造函数,用1覆盖101
答案 0 :(得分:1)
阴影(派生类中的number
隐藏了一个基类)并且接口由基类实现的事实导致了这种行为。基类和IClass.number
定义的映射接口方法映射到BaseClass.number
,与DerivedClass.number
完全不同。
修正:
number
为virtual
(更标准的方法)从接口派生这两个类,所以接口实际上从派生类中获取实现(会混淆读者,每个人都会尝试从派生中删除接口,从而再次破坏它)
class Derived : BaseClass, IClass { ...
注意:
new public int number {get;set;}
。 virtual
。