プライベート メンバーは、子クラスには表示されません。保護された仮想は、あなたが望むように機能すると思いますか?
アップデート:
ここでは、C# 内で関数の継承とオーバーライドを使用して何ができるかについて詳しく説明します。やや意味のある例を使用しようとしましたが、それはクラス設計が貧弱であり、この方法で説明されているクラスの実装はお勧めしません。ただし、これにより、元の問題を許容できる方法で解決するための手段が得られることを願っています。具象クラスがそのメンバーのいずれかを呼び出すのを防ぐ方法はありませんが、構造がとにかくこのようなものである場合、おそらく問題にはなりません。
public abstract class Animal
{
public void DisplayAttributes()
{
Console.WriteLine(Header());
Console.WriteLine("Name: " + Name());
Console.WriteLine("Legs: " + Legs());
Console.WriteLine();
}
protected virtual int Legs()
{
return 4;
}
private string Header()
{
return "Displaying Animal Attributes";
}
protected abstract string Name();
}
public class Bird : Animal
{
protected override string Name()
{
return "Bird";
}
protected override int Legs()
{
return 2;
}
}
public class Zebra : Animal
{
protected override string Name()
{
return "Zebra";
}
}
public class Fish : Animal
{
protected override string Name()
{
return "Fish";
}
protected override int Legs()
{
return 0;
}
private string Header()
{
return "Displaying Fish Attributes";
}
protected virtual int Gils()
{
return 2;
}
public new void DisplayAttributes()
{
Console.WriteLine(Header());
Console.WriteLine("Name: " + Name());
Console.WriteLine("Gils: " + Gils());
Console.WriteLine();
}
}
class Program
{
static void Main(string[] args)
{
Bird bird = new Bird();
bird.DisplayAttributes();
//Displaying Animal Attributes
//Name: Bird
//Legs: 2
Zebra zebra = new Zebra();
zebra.DisplayAttributes();
//Displaying Animal Attributes
//Name: Zebra
//Legs: 4
Fish fish = new Fish();
fish.DisplayAttributes();
//Displaying Fish Attributes
//Name: Fish
//Gils: 2
List<Animal> animalCollection = new List<Animal>();
animalCollection.Add(bird);
animalCollection.Add(zebra);
animalCollection.Add(fish);
foreach (Animal animal in animalCollection)
{
animal.DisplayAttributes();
//Displaying Animal Attributes
//Name: Bird
//Legs: 2
//Displaying Animal Attributes
//Name: Zebra
//Legs: 4
//Displaying Animal Attributes
//Name: Fish
//Legs: 0
//*Note the difference here
//Inheritted member cannot override the
//base class functionality of a non-virtual member
}
}
}
この例では、Bird、Zebra、および Fish はすべて Name および Legs メソッドを呼び出すことができますが、この例のコンテキスト内では、そうすることが必ずしも有用であるとは限りません。さらに、Fish で示されているように、具象派生クラスのインスタンスに対して DisplayAttributes() を変更できます。ただし、foreach ループのように Animal を見ている場合は、実際の動物の種類に関係なく、基本クラスの DisplayAttributes の動作が得られます。これが、複製したい機能のタイプを提供するのに役立つことを願っています.