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

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

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

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

継承

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

Unity

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

Q&A

解決済

2回答

371閲覧

unity C# 継承について

yuuyu

総合スコア1139

C#

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

継承

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

Unity

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

0グッド

0クリップ

投稿2019/08/14 12:58

編集2019/08/14 13:20

前提

C#で継承を使おうと思い、googleで検索しながら試行錯誤していたのですが、
一つ悩みの点があったので質問です。

C#

1class _base{ 2 public virtual void Func() { 3 } 4} 5class MainClass : _base{ 6 public override void Func() { 7 print("show"); 8 } 9} 10class CallClass{ 11 void main(){ 12 MainClass ma = new MainClass(); 13 _base ba = ma; 14 ba.Func(); 15 } 16}

これで、CallClassのvoid main()を呼び出すと、

show

と表示されると思います(print関数はUnityのprintのことです。)

実現したいこと-1

上記でも十分実現したいことはできているのですが、
Funcをいろんなclassで書くにあたって、
「public override void Func() 」
と毎回書くのは少し長い気がします。
勿論なければこれで書くしかないのですが、個人的には、

C#

1class _base{ 2 public void Func() { 3 } 4} 5class MainClass : _base{ 6 public void Func() { 7 print("show"); 8 } 9} 10class CallClass{ 11 void main(){ 12 MainClass ma = new MainClass(); 13 base ba = ma; 14 ba.Func(); 15 } 16}

のように、「virtual」「override」を省略してもMainClass内のFunc()を実行したいです。

実現したいこと-2

上記で無理であれば、別の方法として、

C#

1class MainClass_1{ 2 public void Func() { 3 print("show_base"); 4 } 5} 6class MainClass_2{ 7 public void Func() { 8 print("show_main"); 9 } 10} 11 12class CallClass{ 13 void main(){ 14 //List<??> lis = new List<??>(); 15 //lis.add(new MainClass_1()); 16 //lis.add(new MainClass_2()); 17 //for(int i = 0; i < lis.count; lis++){ 18 // lis[i].Func(); 19 //} 20 } 21}

(クラス名が違うので、そもそも1つのリストにまとめれない気がしますが、)
このように、複数のクラスを一つのリストにまとめて、同じ関数名のものを呼び出したいです。

もし何かあれば教えていただきたいです。

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

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

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

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

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

Zuishin

2019/08/14 13:10

2 がどういうことかわかりません。不完全なコードでは何も説明できないので、日本語で説明してください。
yuuyu

2019/08/14 13:21

改めて見直すと日本語になってませんでしたね。申し訳ないです。修正しました。
guest

回答2

0

ベストアンサー

1 については、できません。文法上の問題です。

2 インターフェースを使ってください。

C#

1public interface IFunc 2{ 3 void Func(); 4} 5 6class MainClass_1 : IFunc 7{ 8 public void Func() { 9 print("show_base"); 10 } 11} 12class MainClass_2 : IFunc 13{ 14 public void Func() { 15 print("show_main"); 16 } 17} 18 19class CallClass{ 20 void main(){ 21 //List<IFunc> lis = new List<IFunc>(); 22 //lis.add(new MainClass_1()); 23 //lis.add(new MainClass_2()); 24 //for(int i = 0; i < lis.count; lis++){ 25 // lis[i].Func(); 26 //} 27 } 28}

投稿2019/08/14 13:30

Zuishin

総合スコア28660

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

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

yuuyu

2019/08/14 13:43

回答ありがとうございます! インターフェイスは初めて知りました。。 コード内の??欄も入れてくれて本当ありがとうございます。 回答を下さったお二人のどちらをベストアンサーにするか迷いましたが、指摘を含めて早く回答してくださったのと、コードの例を提示してくださったZuishinさんにベストアンサーにします。お二人ともありがとうございました!
guest

0

「virtual」「override」を省略してもMainClass内のFunc()を実行したいです。

「仮想メソッドを持ったオブジェクトを継承して継承先でオーバーライドする」という前提なら無理です。

あと、クラス名のbaseは予約語なんで、質問文のコードは適切じゃないと思います。(説明にも支障が出る)

ここでは「親クラス」と言いますが、親クラスのFunc()メソッドが直接使われず、継承先でbase.Func()の呼び出しもない場合は、親クラスの定義を削除してvoid Func()を定義したインターフェイスを継承するようにすれば、希望されてるような事はできます。
(ここでのbase.Func()baseは予約語の方)

投稿2019/08/14 13:18

編集2019/08/14 13:29
gentaro

総合スコア8949

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

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

yuuyu

2019/08/14 13:40

回答ありがとうございます! baseは予約語だったの気づいていませんでした、申し訳ないです。。 インターフェイスというのがあったのですね、初めて知りました。 今回は親クラス内では何もしなかったので、この方法を利用しようと思います!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問