質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

3回答

972閲覧

【C#】派生クラスでoverrideもnewも定義しない場合、どちらになりますか。

pipipi_w

総合スコア11

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2022/06/24 02:18

【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は、基底クラスと派生クラスで型が同一でないとコンパイルエラーになりますが、
何も定義しない場合、型が違ってもコンパイルエラーにならないため、派生クラスで定義した内容で上書きされている。という認識で合っていますか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2022/06/24 02:23

実際にやってみたらわかります。試験中ですか?
pipipi_w

2022/06/24 02:38

確認しようとしていますが、まだ環境構築の段階です。。
pipipi_w

2022/06/24 02:39

警告が出るというのも、ネットで調べた情報です。
Zuishin

2022/06/24 03:04

環境構築ができていないと、回答の裏取りもできません。そちらを先に進めてください。 オンラインで試す方法もあります。 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 ここで「非表示」と「オーバーライド」が別の意味で使われていることに注意してください。「非表示」のメンバーは、表示されないだけで生きています。
pipipi_w

2022/06/24 04:45

ありがとうございます。 newもoverrideも定義しなかった場合はnewになる。 newは変数の型によって、基底クラスのメソッドが呼ばれるか派生クラスのメソッドが呼ばれるか変わるため、newした型が派生クラスの型であれば派生クラスのメソッド、基底クラスにキャストした後にメソッドを呼び出すと基底クラスのメソッドが使われる。 上記のような動きだと思いましたので、頂いたサイトでオンラインで試してみたいと思います。 大変参考になりました。ありがとうございます。
退会済みユーザー

退会済みユーザー

2022/06/26 23:06

質問者さん、その後無言ですが、回答に対するフィードバックを返してください。役に立った/立たなかったぐらいはすぐに返せるのでは? 役に立たなかったならどこがダメかを書くとより期待に近い回答が出てくるかも。とにかく無言は NG です。
pipipi_w

2022/06/27 00:39

すみません。返していませんでした。 只今返しました。回答ありがとうございます。
guest

回答3

0

【C#】派生クラスでoverrideもnewも定義しない場合、どちらになりますか。

以下のコード(VS2022 で作った .NET 6.0 のコンソールアプリ)ですと、

var a = new A(); a.Test_New(); a.Test_Override(); a.Test(); Console.WriteLine("----------------"); var b = new B(); b.Test_New(); b.Test_Override(); b.Test(); Console.WriteLine("----------------"); var c = (A)b; c.Test_New(); c.Test_Override(); c.Test(); public class A { public void Test_New() => Console.WriteLine("A::Test_New"); public virtual void Test_Override() => Console.WriteLine("A::Test_Override"); public void Test() => Console.WriteLine("A::Test"); } public class B : A { public new void Test_New() => Console.WriteLine("B::Test_New"); public override void Test_Override() => Console.WriteLine("B::Test_Override"); }

以下の通りとなります。質問者さんの疑問にすべて答えているでしょうか?

イメージ説明

投稿2022/06/24 05:13

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pipipi_w

2022/06/27 00:38

ありがとうございます。 疑問としては、派生クラス(class B)内でoverrideもnewも定義しない場合、Aの内容になるのかBの内容になるのか知りたかったです。 しかし、とても参考になりました。ありがとうございます。
guest

0

自己解決

質問への追記依頼にて頂いた回答で解決しました。

派生クラスにてnewもoverrideも定義しなかった場合は、newと同じ動作になることがわかりました。

また、newは変数の型によって、基底クラスのメソッドが呼ばれるか派生クラスのメソッドが呼ばれるか変わるため、newした型が派生クラスの型であれば派生クラスのメソッド、基底クラスにキャストした後にメソッドを呼び出すと基底クラスのメソッドが使われることもわかりました。

ありがとうございました。

投稿2022/06/27 00:41

pipipi_w

総合スコア11

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

派生クラスで定義した内容で上書きされている。という認識で合っていますか?

あってます

投稿2022/06/24 02:38

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2022/06/24 03:05 編集

「上書き」がオーバーライドを指すのは質問より明らかです。 間違った回答なので、低評価します。
pipipi_w

2022/06/24 04:52 編集

ありがとうございます。
KOZ6.0

2022/06/24 03:03

B のインスタンスを A にキャストしてください。 Test_New を実行すると A のものが実行されます。 「非表示にする」というのが妥当かと思います。(エラーメッセージもそのようになっています。) 対して Test_Override のほうは B のものが実行されるので、「上書き」ですね。
pipipi_w

2022/06/24 04:45

ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問