「仮想/オーバーライド」がある場合、「保護」の必要性または目的を理解できませんでした。それらがほぼ同じである場合、これら2つのものが何が必要かを誰かが説明してくれます。
編集:
すべてのヘルパーに感謝します。「保護」は可視性のみを目的としており、仮想/オーバーライドはクラスの動作を目的としていることを理解しました。
それらは確かにほとんど同じではありません。
protected
修飾子は、フィールドまたはメソッドの可視性を設定します。その ようなメンバーは、定義されているクラスまたは派生クラスからのみアクセスできます。
virtual
修飾子は、それが適用されるメソッドを派生クラスに含めることができることを指定します。overridden
これらの修飾子は組み合わせることができます。つまり、メソッドを保護して仮想にすることができます。
おそらく既に読んだものではなく、いくつかのコードを使用する方が良いかもしれません。ここに、あなたが試すことができる小さなサンプルがあります。コメント (//) を削除してみると、プロパティにアクセスできないことがコンパイラによって通知されることがわかります。
[TestFixture]
public class NewTest
{
[Test]
public void WhatGetsPrinted()
{
A a= new B();
a.Print(); //This uses B's Print method since it overrides A's
// a.ProtectedProperty is not accesible here
}
}
public class A
{
protected string ProtectedProperty { get; set; }
private string PrivateProperty { get; set; }
public virtual void Print()
{
Console.WriteLine("A");
}
}
public class B : A
{
public override void Print() // Since Print is marked virtual in the base class we can override it here
{
//base.PrivateProperty can not be accessed hhere since it is private
base.ProtectedProperty = "ProtectedProperty can be accessed here since it is protected and B:A";
Console.WriteLine("B");
}
}
についての最も重要な違いvirtual
は、メソッドメンバーをポリモーフィックに呼び出すときに、コンパイラがコンパイルされたコードをどの実装にバインドするかということです。オブジェクトの実際の型が派生クラスであるクライアントコードからクラスのメンバーを呼び出す場合、foo
呼び出される変数は実際には何らかの基本クラスとして型指定 (宣言) さbar
れvirtual
ます。実際のオブジェクト型の実装 (または実装を持つオブジェクト型の最も派生した基本クラス) に。virtual として宣言されていないメンバーは、変数が宣言されている型の実装にバインドされます。
A. 仮想。次に、メンバーが仮想として宣言されている場合、変数が基本型として宣言されていても、派生クラスの実装が実行されます。
public class Animal
{ public virtual Move() { debug.Print("Animal.Move()"); }
public class Bird: Animal
{ public virtual override Move() { debug.Print("Bird.Move()"); }
Animal x = new Bird();
x.Move(); // Will print "Bird.Move"
B.仮想ではない。として宣言されていないメンバーvirtual
の場合、メソッドが実行される変数の宣言された型に基づいて実装が選択されます。したがって、変数 x に「Animal」として宣言された Bird オブジェクトがあり、両方のクラスで実装されているメソッドを呼び出すと、コンパイラは、Bird ではなく Animal クラスの実装にバインドします。本当に鳥。
public class Animal
{ public Move() { debug.Print("Animal.Move()"); }
public class Bird: Animal
{ public Move() { debug.Print("Bird.Move()"); }
Animal x = new Bird();
x.Move(); // Will print "Animal.Move"
上記2つは目的が異なるので、きちんと理解する必要があると思います。
protectedは、同じクラスまたは構造体、または派生クラス内のコードによってのみアクセスできる型またはメンバーです。
virtualキーワードは、メソッド、プロパティを変更し、派生クラスでオーバーライドできるようにするためのものです。