1

例として、 .NET SHA256Managedクラスを考えてみましょう。

SHA256Managedは、Create() という名前のメソッドを持つ抽象クラス SHA256 から継承します。ドキュメントによると、Create() は SHA256 のデフォルト実装のインスタンスをインスタンス化します。

私はおそらく次のようなものを書くでしょう

using (SHA256Managed Sha256Managed = new SHA256Managed())
{
  // code
}

一方、Microsoft の例では次の使用を選択しています。

SHA256 mySHA256 = SHA256Managed.Create();

(基本クラスからの) Create() のようなメソッドは、そこから派生したクラスのインスタンスをどのようにインスタンス化しますか?

4

5 に答える 5

2

関数は、あなたが望むもののインスタンスを返すことができます;)

この場合、 のインスタンス256Managedは引き続きキャスト可能です。SHA256

このようなものは完全に実行可能です:

public class SHA256Managed 
{
   public static SHA256 Create() 
   {
       return new SHA256Managed();
   }
}
于 2013-06-07T00:22:58.570 に答える
0

SHA256クラスでは、メソッドCreateは「System.Security.Cryptography.SHA256 のデフォルト実装のインスタンス」を返す静的メソッドです (メソッドのドキュメントによると)。このデフォルトの実装はSHA256Managed- の非抽象子クラスですSHA256

SHA256とクラスはSHA256Managed同じアセンブリで定義されているため、は有効なクラスとしてSHA256Managed使用できます。SHA256.Create

Create非抽象派生クラスのインスタンスを作成する静的メソッドを持つ抽象基本クラスの例を次に示します。

public abstract class A
{
    public static A Create()
    {
        return new B();
    }

    public abstract void DoSomething();
}

public class B : A
{
    public override void DoSomething()
    {
        // do nothing.
    }
}

実際には、コンパイラはアセンブリ全体のクラスとそのメンバーのリストを作成してから、それらのメンバーのコードをコンパイルします。そのため、A.Createメソッドがコンパイルされるまでに、コンパイラは class の存在と構造を既に認識していBます。

そのため、次のように、プロパティとメソッドを参照する最初のポイントの後にクラスに配置しても問題ありません。

class C
{
    void some_method()
    {
        ++counter;
    }

    int counter;
}

Cコンパイラは、コードをコンパイルする前にクラスの構造全体を認識しているため、エラーなしsome_methodでステートメントをコンパイルできます。++counter;

于 2013-06-07T02:24:39.363 に答える
0

クラスのメソッドまたはプロパティは、任意の派生クラス (またはそれ自体をフィールドとして) を必要なだけ使用できます。メソッドが独自の基本クラスのオブジェクトのみを使用できるという言語の制限はありません。

抽象クラスでできない唯一のことはnew、そのようなクラスのインスタンスに対してであり、非抽象クラス/構造体の有効なインスタンスを返すそのようなクラスの静的メンバーを呼び出すことは完全に問題ありません。

次の有効なコードは、独自のクラスまたは派生クラスを返すことができることを示しています。

class Base 
{
  public Derived Property1 {get;set;}
  public Base Property2 {get;set;}      

  public static Base Create()
  {
    return new Derived();
  }

  public static Derived Create2()
  {
    return new Derived();
  }
}

class Derived : Base
{
}
于 2013-06-07T00:40:27.670 に答える
-1

私が間違っていなければ、あなたが考えているのは、基本クラスのメソッドをSHA256Managed.Create()呼び出すことです。Create()SHA256

Create()メソッドはオーバーライドできない静的メソッドであり、キーワードを使用してSHA256Managedクラスに実装されます。詳細はこちらnew

編集

したがって、(ILSPYを使用して)より深く掘り下げた後、Create()メソッドSHA256はそれほど単純ではないことがわかりました。それは call another classCryptoConfig.CreateFromNameです。(派生クラス)に関する情報が何らかの構成メカニズムに存在すると推測します。SHA256Managed

@ 280Z28 : 訂正ありがとうございます

于 2013-06-07T00:59:51.410 に答える