【问题标题】:Interface property refering to Base class引用基类的接口属性
【发布时间】:2017-04-23 07:12:30
【问题描述】:

在这里运行它: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

【问题讨论】:

  • 让它virtualoverride它。

标签: c# inheritance interface


【解决方案1】:

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

修复:

  • 在基类中将属性number 设为virtual(更标准的方法)
  • 从接口派生两个类,因此接口实际上从派生类中获取实现(会使读者感到困惑,每个人都会尝试从派生类中删除接口,从而再次破坏它)

    class Derived : BaseClass, IClass { ...
    

注意事项:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-01
    相关资源
    最近更新 更多