11

「仮想/オーバーライド」がある場合、「保護」の必要性または目的を理解できませんでした。それらがほぼ同じである場合、これら2つのものが何が必要かを誰かが説明してくれます。

編集:

すべてのヘルパーに感謝します。「保護」は可視性のみを目的としており、仮想/オーバーライドはクラスの動作を目的としていることを理解しました。

4

4 に答える 4

20

それらは確かにほとんど同じではありません。

protected修飾子は、フィールドまたはメソッドの可視性を設定します。その ようなメンバーは、定義されているクラスまたは派生クラスからのみアクセスできます。

virtual修飾子は、それが適用されるメソッドを派生クラスに含めることができることを指定しますoverridden

これらの修飾子は組み合わせることができます。つまり、メソッドを保護して仮想にすることができます。

于 2012-10-30T18:43:57.593 に答える
8
  • protectedは、現在のクラスと派生クラスのプライベートを意味します
  • virtualは、そのまま使用できるだけでなく、派生クラスでオーバーライドできることを意味します

おそらく既に読んだものではなく、いくつかのコードを使用する方が良いかもしれません。ここに、あなたが試すことができる小さなサンプルがあります。コメント (//) を削除してみると、プロパティにアクセスできないことがコンパイラによって通知されることがわかります。

[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");
    }
}
于 2012-10-30T18:42:50.770 に答える
7

についての最も重要な違いvirtualは、メソッドメンバーをポリモーフィックに呼び出すときに、コンパイラがコンパイルされたコードをどの実装にバインドするかということです。オブジェクトの実際の型が派生クラスであるクライアントコードからクラスのメンバーを呼び出す場合、foo呼び出される変数は実際には何らかの基本クラスとして型指定 (宣言) さbarvirtualます。実際のオブジェクト型の実装 (または実装を持つオブジェクト型の最も派生した基本クラス) に。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"
于 2012-10-30T19:07:57.553 に答える
3

上記2つは目的が異なるので、きちんと理解する必要があると思います。

protectedは、同じクラスまたは構造体、または派生クラス内のコードによってのみアクセスできる型またはメンバーです。

virtualキーワードは、メソッド、プロパティを変更し、派生クラスでオーバーライドできるようにするためのものです。

于 2012-10-30T18:45:39.617 に答える