【C#】派生クラスでoverrideもnewも定義しない場合、どちらになりますか。
class A { public void Test_New() => Console.WriteLine("A::Test_New"); public virtual void Test_Override() => Console.WriteLine("A::Test_Override"); } class B : A { public new void Test_New() => Console.WriteLine("B::Test_New"); public override void Test_Override() => Console.WriteLine("B::Test_Override"); }
初心者です。
上記のような場合、overrideを定義すれば上書されると思いますが、
派生クラスでovrrideもnewも定義しない場合(警告は出ます)、派生クラスで定義した内容で上書きされるのでしょうか?
それとも基底クラスで定義した内容になりますか?
overrideは、基底クラスと派生クラスで型が同一でないとコンパイルエラーになりますが、
何も定義しない場合、型が違ってもコンパイルエラーにならないため、派生クラスで定義した内容で上書きされている。という認識で合っていますか?
実際にやってみたらわかります。試験中ですか?
確認しようとしていますが、まだ環境構築の段階です。。
警告が出るというのも、ネットで調べた情報です。
環境構築ができていないと、回答の裏取りもできません。そちらを先に進めてください。
オンラインで試す方法もあります。
https://wandbox.org/
テキストに書いてあると思いますが、override した場合と new した場合では、基本クラスにキャストした時の動きが変わります。
new を書かないと警告が出るのは、書かなかった場合には new になるが、それを明示しないことがバグの原因になるからです。
https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/classes-and-structs/versioning-with-the-override-and-new-keywords
ここで「非表示」と「オーバーライド」が別の意味で使われていることに注意してください。「非表示」のメンバーは、表示されないだけで生きています。
ありがとうございます。
newもoverrideも定義しなかった場合はnewになる。
newは変数の型によって、基底クラスのメソッドが呼ばれるか派生クラスのメソッドが呼ばれるか変わるため、newした型が派生クラスの型であれば派生クラスのメソッド、基底クラスにキャストした後にメソッドを呼び出すと基底クラスのメソッドが使われる。
上記のような動きだと思いましたので、頂いたサイトでオンラインで試してみたいと思います。
大変参考になりました。ありがとうございます。
質問者さん、その後無言ですが、回答に対するフィードバックを返してください。役に立った/立たなかったぐらいはすぐに返せるのでは? 役に立たなかったならどこがダメかを書くとより期待に近い回答が出てくるかも。とにかく無言は NG です。
すみません。返していませんでした。
只今返しました。回答ありがとうございます。
回答3件
あなたの回答
tips
プレビュー