web-dev-qa-db-ja.com

C#で継承されたクラスプロパティをオーバーライドするにはどうすればよいですか?

基本クラスのメソッドに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をここで使用しないようにというエラーが表示されます。

17
Rob

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

flyprotectedとしてマークする必要があることに注意してください。

しかし、さらに良いことに、私は次のようなことをします:

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

これはあなたの例ではプロパティではなく、フィールドです。プロパティを使用するか、サブクラスでアクセスできるように、単にflyを保護済みとしてマークしてみてください。

3
Steve Danner

このコード:

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

プロパティではなく、フィールドを作成しています。また、仮想であるためには、プロパティは「private」よりも高いアクセス権を持っている必要があります。あなたはおそらくこのようなものが欲しいでしょう:

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