基本クラスのメソッドに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
をここで使用しないようにというエラーが表示されます。
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;
}
}
}
これはあなたの例ではプロパティではなく、フィールドです。プロパティを使用するか、サブクラスでアクセスできるように、単にflyを保護済みとしてマークしてみてください。
このコード:
private virtual string fly = "Yes, I can!";
プロパティではなく、フィールドを作成しています。また、仮想であるためには、プロパティは「private」よりも高いアクセス権を持っている必要があります。あなたはおそらくこのようなものが欲しいでしょう:
public virtual string Fly
{
get { return "Yes, I can!"; }
}