2016-12-08 4 views
1

Выполнить его здесь: 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 конструктора, перекрывая 101 с 1

+0

Сделать это '' virtual' и override' его. – smoksnes

ответ

1

Shadowing (number в производном классе скрывает один из базы) и тот факт, что интерфейс реализуется базовым классом, приводит к такому поведению. Методы сопоставления интерфейса, определенные базовым классом, и IClass.number сопоставляются с BaseClass.number, который полностью отличается от DerivedClass.number.

Исправления:

  • сделать свойство number быть в базовом классе (более стандартный подход)
  • вывести оба класса из интерфейса, так интерфейс на самом деле подхватывает реализацию из производного класса virtual (запутает читателей и каждый будет пытаться удалить интерфейс из полученных таким образом, разбивая его снова)

    class Derived : BaseClass, IClass { ... 
    

Примечание:

  • Лучше явно указать new public int number {get;set;} при теневых членах базового класса.
  • C# не является Java и методы/поля по умолчанию не являются virtual.
  • Difference between shadowing and overriding in C#?
Смежные вопросы