接口属性引用Base类

时间:2016-12-08 06:01:44

标签: c# inheritance interface

在此处运行: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

1 个答案:

答案 0 :(得分:1)

阴影(派生类中的number隐藏了一个基类)并且接口由基类实现的事实导致了这种行为。基类和IClass.number定义的映射接口方法映射到BaseClass.number,与DerivedClass.number完全不同。

修正:

  • 在基类中使属性numbervirtual(更标准的方法)
  • 从接口派生这两个类,所以接口实际上从派生类中获取实现(会混淆读者,每个人都会尝试从派生中删除接口,从而再次破坏它)

    class Derived : BaseClass, IClass { ...
    

注意: