2010-12-10 4 views
14

Я узнал, как наследовать методы, добавив virtual к методу базового класса и override в новый класс. Но что мне делать, чтобы наследовать свойства?Как переопределить свойство унаследованного класса в C#?

class bird 
{ 
    private virtual string fly = "Yes, I can!"; 
    public string CanI() { return fly ; } 
} 

class penguin : bird 
{ 
    private override string fly = "No, I can't!"; 
} 

Это вызывает ошибку, сказав, что модификаторы virtual/override не должны использоваться здесь.

ответ

25

fly не является собственностью, это поле. Поля не переопределяемы. Вы можете сделать это:

class bird { 
    protected virtual string Fly { 
     get { 
      return "Yes, I can!"; 
     } 
    } 
    public string CanI() { return Fly; } 
} 

class penguin : bird { 
    protected override string Fly { 
     get { 
      return "No, I can't!"; 
     } 
    } 
} 

Обратите внимание, что я должен был отметить fly как protected.

Но еще лучше, я бы сделал что-то вроде этого:

abstract class Bird { 
    public abstract bool CanFly { get; } 
    public string SayCanFly() { 
     if(CanFly) { 
      return "Yes, I can!"; 
     } 
     else { 
      return "No, I can't!"; 
     } 
    } 
} 

class Penguin : Bird { 
    public override bool CanFly { 
     get { 
      return false; 
     } 
    } 
} 

class Eagle : Bird { 
    public override bool CanFly { 
     get { 
      return true; 
     } 
    } 
} 
+0

Кажется работать, спасибо! :) – Rob

+3

@Downvoter: Действительно, вы должны объяснить. – jason

+0

Теперь я увидел нижний план. Я действительно не хотел, чтобы вы ответили вам. Ложный щелчок мыши? Извините за неудобство, я удалил его. – Luca

3

Это не свойство в вашем примере, это поле. Попробуйте использовать свойство или просто пометьте fly как защищенный, чтобы его можно было получить в вашем подклассе.

1

Этот код:

private virtual string fly = "Yes, I can!"; 

создает поле, а не свойство. Кроме того, для того, чтобы быть виртуальным, ваша собственность должна иметь доступ выше, чем «частный». Вероятно, вы хотите что-то вроде этого:

public virtual string Fly 
{ 
    get { return "Yes, I can!"; } 
} 
Смежные вопросы