Как переопределить наследуемое свойство класса в C #? - PullRequest
16 голосов
/ 10 декабря 2010

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

Ответы [ 3 ]

29 голосов
/ 10 декабря 2010

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;
        }
    }
}
3 голосов
/ 10 декабря 2010

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

1 голос
/ 10 декабря 2010

Этот код:

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

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

public virtual string Fly
{
  get { return "Yes, I can!"; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...