C# new と override の比較
このチュートリアルでは、C# の new
キーワードと override
キーワードの違いについて説明します。
C# の new
キーワード
new
キーワードは C# では非常に一般的です。従来、演算子、修飾子、制約の 3つの異なる場所で使用できます。
new
キーワードの最初で最も一般的な使用法は、クラスオブジェクトを作成し、C# でそれらのクラスコンストラクターを呼び出す演算子としてです。new
キーワードを使用すると、int
や float
などの値タイプのオブジェクトがスタック内に作成され、ユーザー定義クラスなどの参照タイプのオブジェクトがヒープ内に作成されます。
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
キーワードを使用するというコンパイラ警告が表示されることです。
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 キーワードは、子実装をその親クラスオブジェクトから非表示にするために使用されます。
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