HOWTO · Csharp

C# で静的メソッドをオーバーライドする

この記事では、C# で静的メソッドをオーバーライドする方法を学習します。

この記事では、抽象基本クラスの静的メソッドのオーバーライドについて説明します。

C# で静的メソッドをオーバーライドする

まず、抽象基本クラスに属する静的メソッドをオーバーライドすることはできません。 これは C# でできることではありません。

これは、静的という言葉はすべての人に適用されるものを指すのに対し、最優先の考え方は、要件に応じて実装を変更するために使用するものであるためです。

静的メソッドをオーバーライドすると、それに付随する静的プロパティが失われます。 したがって、C# の静的メソッドはオーバーライドできません。

ただし、ルールを破って、要件を満たすために逆の順序でタスクを実行することはできます。

C# で静的メソッドをオーバーライドする別の方法

隠蔽は使えるアイデアだし、使える。 この考え方は、仮想関数を構築するときに使用される Early Binding と Late Binding にも重要です。

インスタンスに基づいて実行時に仮想メソッドの実装が選択される場合、これはオーバーライドと呼ばれます。 ビルド時に同じ名前のメソッドが複数選択される場合、オーバーロードと呼ばれます。

オーバーロードは、オブジェクト指向ポリモーフィズムの必須コンポーネントというよりも便利です。

静的メソッドのオーバーロードは、最初はオーバーライドに似ている場合があります。 提供されたクラスで静的メソッドが見つからない場合、コンパイラは一致するメソッドが見つかるまで継承構造を検索します。

メソッドはビルド時に解決および修正されます。これが重要な違いです。 これは真のオーバーライドではないため、静的メソッドを virtualoverride、または new とラベル付けすることはできません。

オーバーライド メソッドの動作は、Liskov Substitution Principle (LSP) を尊重する必要があります。 より一般的に言えば、オーバーライド メソッドの動作は、仮想メソッドの規約に従う必要があります。

これらの制約は、オーバーロードされた静的メソッドには適用されません。より正確には、同じ名前で異なる機能を提供する別個のメソッドとして考えられます。

new キーワードは、同じ名前で異なるアクションを持つメンバーを確立します。

new キーワードを使用すると、この警告は通常のように表示されません。 さらに、デリゲートを使用して親の非表示メソッドをいつでも呼び出す必要さえないことに注意してください。 あなたがしなければならないのは、彼らにフルネームを与えることだけです。

C# での静的メソッドの非表示の実装

using System;

class Hi {
  static void Main() {
    C2.Calldisplay();
  }
}

class C1 {
  public static void display() {
    System.Console.WriteLine("Class 1 it is");
  }
}
class C2 : C1 {
  public static void display() {
    System.Console.WriteLine("Class 2 it is");
  }
  public static void Calldisplay() {
    display();
    C1.display();
  }
}

出力:

Class 2 it is
Class 1 it is

display() メソッドは C1 クラスから C2 クラスによって継承され、C1.display() を呼び出します。 C1 クラスから継承された C2 クラスの C1.display() という名前の関数は、C1 クラスである親の非表示の静的メソッドを呼び出します。

静的メソッドはインスタンスで呼び出すことができず、それらが属する型の名前を指定して呼び出す必要があるという事実は、私たちの見解では、それらを非表示にする慣行を正当化します。 メソッドについて行う最も重要な決定は、それが静的メソッド、インスタンス メソッド、または 仮想 メソッドのいずれであるかということです。

new という用語を使用すると、ポリモーフィズムを維持できなくなります。 特定の動作を再解釈するのに役立つかもしれませんが、非常に注意して使用する必要があり、使用方法と場所については十分に注意する必要があります。

再定義されたプロパティを呼び出すときに基本クラスを表示すると、現在のプロパティではなく、以前のバージョンのプロパティが取得されます。

これは言語によって課せられた制限であるため、アセンブリ間で部分クラスを指定することはできないことに注意してください。

理想的な世界では、それらを使用して、広範なクラスを多くのファイルに分割する必要があります (そうしないと、何かが間違っている可能性があります)。 それらを使用してコードを共有し、クロスプラットフォーム開発を容易にすることができます (すべてのコードがすべてのプラットフォームで機能するとは限らないため)。

複数のプラットフォーム向けに開発している場合、その状況では、この戦略を利用できる可能性があります。 ただし、クラスをモデル化する別の方法を検討する必要があります。 けがに侮辱を加えるために、それはまったく判読できません!

部分クラスが使用される場合、すべてのコンポーネントに対して拡張検索が行われるのが一般的です。 これは、何が起こっているのかを初心者が理解するのをより困難にする以外には何もしません。

このようにすることで、別の方法を使用して抽象基本クラスの静的メソッドをオーバーライドする作業を完了することができます。