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

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

新規登録して質問してみよう
ただいま回答率
85.48%
オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

継承

継承(インヘリタンス)はオブジェクト指向プログラミングに存在するシステムです。継承はオブジェクトが各自定義する必要をなくし、継承元のオブジェクトで定義されている内容を引き継ぎます。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

2回答

575閲覧

継承元を抽象メソッドにするか、仮想メソッドにするか意見をください

JrMogura

総合スコア14

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

継承

継承(インヘリタンス)はオブジェクト指向プログラミングに存在するシステムです。継承はオブジェクトが各自定義する必要をなくし、継承元のオブジェクトで定義されている内容を引き継ぎます。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2020/06/22 14:45

前提・実現したいこと

Unityでゲームを作っているのですが、キャラのクラスで、抽象メソッドを使用するか、仮想メソッドにするか悩む部分が出てきました。
なるべくみんながミスなくコーディングでき、依存も少なくするには、どちらがいいか、意見を頂けますでしょうか。

コード例

Awakeから呼ばれるOnAwakeメソッドについて

抽象メソッドを使用した場合

class Base{ void Awake{ // 共通処理 // ... OnAwake(); } protected abstruct void OnAwake(); } class Abc : Base{ protected override void OnAwake(){ // 個別処理 // ... } }

◆メリット
継承元コードを追わなくても、OnAwakeの存在を意識できる
◆デメリット
今後OnAwakeを使用しない形になった場合に、全継承先を修正する必要がある

仮想メソッドを使用した場合

class Base{ void Awake{ // 共通処理 // ... OnAwake(); } protected virtual void OnAwake(){ } } class Abc : Base{ protected override void OnAwake(){ // 個別処理 // ... } }

メリット
継承先クラスは必要でなければOnAwakeを書かなくて済むので、
今後OnAwakeを使用しない形になった場合などに、修正が最小限になる
デメリット
継承元をちゃんと読まないと、OnAwakeの存在に気づけない

補足情報

単純にAwakeを継承する案もありましたが、base.Awakeの呼び出し漏れが怖いのでやらない方がいいかと考えました。また、実をいうと、個人的には仮想関数を使用する形の方がいいと考えていたのですが、「継承元に空メソッドを置くのが悪!」という話を聞いたので、怖くなって質問させていただきました。

以上になります。よろしくお願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

ちゃんとis-a関係が成立しているクラス関係なら、子孫全部共通した振る舞いがあり、場合によって継承先で追加の振る舞いを行いたい場合はvirtualにするし、子孫同士で同じ振る舞いをしたくない場合はabstractにします。

メリット・デメリットについて処理の共通化と修正工数の観点から考えているみたいですが、それは設計意図を無視して実装上の都合での選択になりがちなので、その処理の本来の意味を考えて選択すれば良いんじゃないでしょうか。

また、実をいうと、個人的には仮想関数を使用する形の方がいいと考えていたのですが、「継承元に空メソッドを置くのが悪!」という話を聞いたので、怖くなって質問させていただきました。

子孫に共通の処理がないのに継承だけを目的としたvirtualメソッドには何の利点もないので、そういう場合はabstractにしましょう。

投稿2020/06/22 15:29

gentaro

総合スコア8949

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

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

JrMogura

2020/06/23 13:36 編集

ご回答ありがとうございます! > 子孫全部共通した振る舞いがあり、場合によって継承先で追加の振る舞いを行いたい場合はvirtual 今回はこちらに該当するので、OnAwakeではなく、Awakeをvirtualにするのが妥当かなあと思います > それは設計意図を無視して実装上の都合での選択になりがちなので、その処理の本来の意味を考えて選択すれば良いんじゃないでしょうか。 はっとさせられました。たしかに設計意図通りじゃないと読みにくいコードになりそうですね。アドバイスありがとうございます!!
guest

0

やりたいことによってケースバイケースだと思いますが、.NetのライブラリではOnXxxxはvirtualで定義されているのでそれに従うのが指針の一つになるのではないでしょうか。
Control.OnClick(EventArgs) メソッド (System.Windows.Forms) | Microsoft Docs

投稿2020/06/22 15:53

ku__ra__ge

総合スコア4524

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問