Как переопределить свойство унаследованного класса в С#?

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

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 здесь не должны использоваться.

Ответы

Ответ 1

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;
        }
    }
}

Ответ 2

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

Ответ 3

Этот код:

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

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

public virtual string Fly
{
  get { return "Yes, I can!"; }
}