C# new と override の比較

Muhammad Maisam Abbas 2024年2月16日
  1. C# の new キーワード
  2. C# の override キーワード
C# new と override の比較

このチュートリアルでは、C# の new キーワードと override キーワードの違いについて説明します。

C# の new キーワード

new キーワードは C# では非常に一般的です。従来、演算子、修飾子、制約の 3つの異なる場所で使用できます。

new キーワードの最初で最も一般的な使用法は、クラスオブジェクトを作成し、C# でそれらのクラスコンストラクターを呼び出す演算子としてです。new キーワードを使用すると、intfloat などの値タイプのオブジェクトがスタック内に作成され、ユーザー定義クラスなどの参照タイプのオブジェクトがヒープ内に作成されます。

new キーワードを演算子として使用する際に留意すべき点は次のとおりです。オブジェクトにメモリを割り当てるだけで、以前は同じスコープに依存していたメモリを破棄せず、の機能をオーバーライドすることはできません。C# の新しいキーワード。

次に、new キーワードを修飾子として使用している間、派生クラスから継承された基本クラスのメンバーを非表示にします。前のステートメントは、継承されたクラスメンバーの新しい定義をオーバーライドまたは宣言する代わりに、new キーワードが基本クラスのそのメンバーの以前の定義を置き換えることを意味します。

new キーワードの 3 番目の使用は、前の 2つと比較して比較的まれです。new キーワードを制約として使用する一方で、ジェネリック型には追加のパラメーターなしでパブリックコンストラクターが必要であることを指定します。

このアプローチの欠点は、抽象型では使用できないことです。

このチュートリアルでは、new キーワードを修飾子として使用して、派生クラスから基本クラスの定義を非表示にします。C# では、コンパイラはデフォルトで継承された関数の定義を暗黙的に非表示にします。

次のコードスニペットは、new キーワードを使用して、継承された関数の定義を派生クラスから明示的に非表示にする方法を示しています。

public class BaseClass {
  public virtual void fun() {
    Console.WriteLine("Base class");
  }
}

public class DerivedClass : BaseClass {
  public new void fun() { Console.WriteLine("Derived class");
}
public static void Main(string[] args) {
  BaseClass b = new BaseClass();
  DerivedClass d = new DerivedClass();
  BaseClass bd = new DerivedClass();
  b.fun();
  d.fun();
  bd.fun();
}
}

出力:

Base class
Derived class
Base class

最初の 2つのオブジェクトの出力は非常に簡単です。BaseClass オブジェクト b は基本クラス内の fun() 関数を参照し、DerivedClass オブジェクト d は派生クラス内の fun() 関数を参照します。

派生クラスの参照を基本クラス bd のオブジェクトに割り当て、fun() 関数を呼び出すと、非常に興味深いことが起こります。今回も基本クラス内の fun() 関数が実行されます。

これは、基本クラス内に fun() 関数を実装することが派生クラスから隠されているためです。

これと同じ目的は、new キーワードを使用せずに達成できます。次のコードスニペットは、new キーワードを使用せずに同じ目的を達成する方法を示しています。

public class BaseClass {
  public virtual void fun() {
    Console.WriteLine("Base class");
  }
}

public class DerivedClass : BaseClass {
  public void fun() {
    Console.WriteLine("Derived class");
  }
  public static void Main(string[] args) {
    BaseClass b = new BaseClass();
    DerivedClass d = new DerivedClass();
    BaseClass bd = new DerivedClass();
    b.fun();
    d.fun();
    bd.fun();
  }
}

出力:

Base class
Derived class
Base class

出力は前のアプローチと同じであることに注意してください。ここでの唯一の違いは、今回は、クラスメンバーを明示的に非表示にするには、new キーワードを使用するというコンパイラ警告が表示されることです。

new キーワードなしのコンパイラ警告

C# の override キーワード

C# では、override 修飾子は基本クラスから継承されたメソッドを拡張します。override キーワードは、基本クラスから継承された virtual メソッドの新しい実装を提供します。

ここで注意すべきことの 1つは、override キーワードを使用して非仮想メソッドまたは static メソッドを拡張することはできないということです。基本クラスの関数は、仮想、抽象、または別のスーパークラスによってオーバーライドされる必要があります。

前の例のコンテキストでは、次のコードスニペットは、override 修飾子を使用して、基本クラスから継承された virtual 関数の機能を拡張する方法を示しています。

public class BaseClass {
  public virtual void fun() {
    Console.WriteLine("Base class");
  }
}

public class DerivedClass : BaseClass {
  public override void fun() {
    Console.WriteLine("Derived class");
  }
  public static void Main(string[] args) {
    BaseClass b = new BaseClass();
    DerivedClass d = new DerivedClass();
    BaseClass bd = new DerivedClass();
    b.fun();
    d.fun();
    bd.fun();
  }
}

出力:

Base class
Derived class
Derived class

最初の 2つのオブジェクトの出力は非常に簡単です。BaseClass オブジェクト b は基本クラス内の fun() 関数を参照し、DerivedClass オブジェクト d は派生クラス内の fun() 関数を参照します。

new キーワードとの本当の違いは、派生クラスの参照を基本クラス bd のオブジェクトに割り当て、fun() 関数を呼び出すときに現れます。前の 2つの例とは異なり、今回は派生クラスの fun() 関数が呼び出されます。

override キーワードは、仮想関数の子実装をその親オブジェクトに表示するために使用されますが、new キーワードは、子実装をその親クラスオブジェクトから非表示にするために使用されます。

Muhammad Maisam Abbas avatar Muhammad Maisam Abbas avatar

Maisam is a highly skilled and motivated Data Scientist. He has over 4 years of experience with Python programming language. He loves solving complex problems and sharing his results on the internet.

LinkedIn

関連記事 - Csharp Keyword