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

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

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

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

解決済

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

pipipi_w
pipipi_w

総合スコア10

C#

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

3回答

0評価

0クリップ

225閲覧

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

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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した型が派生クラスの型であれば派生クラスのメソッド、基底クラスにキャストした後にメソッドを呼び出すと基底クラスのメソッドが使われる。 上記のような動きだと思いましたので、頂いたサイトでオンラインで試してみたいと思います。 大変参考になりました。ありがとうございます。
SurferOnWww

2022/06/26 23:06

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

2022/06/27 00:39

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

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

C#

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