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

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

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

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

Q&A

解決済

2回答

1939閲覧

C#で多重継承のような機能を実装したい

hayamura.akito

総合スコア3

C#

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

1グッド

0クリップ

投稿2021/06/15 03:39

前提・実現したいこと

C#で対戦型カードゲームを作成しようとしています。
カード自体に様々な効果をつけるため、Cardというクラスを作成し、その中にコストやフレイバーテキストなどのプロパティがあります。

C#

1internal abstract class Card 2 { 3 internal string Id { get; set; } 4 5 internal string Name { get; set; } 6 7 internal int Cost { get; set; } 8 9 internal string Flavor { get; set; } 10

カードの効果を大まかにいくつかに分けて実装しようとしており、(回復、攻撃など)それぞれの効果についてインターフェースを実装しています。

この時、例えば攻撃の効果を持つカードは、大半が、相手にX(=コスト)ダメージを与える効果を持つが、特定のカードだけはX+1ダメージを与える効果を持つようにしたい場合について、どのように実装すればよいかが分かりません。(X+1については、カードによってX-1だったり、ターン数がそのままダメージになったりします。)

攻撃の効果を持つカードを、Cardクラスを継承した、AttackCardクラスを継承するようにして、X+1等の特定の値を返すクラスのみ、攻撃用メソッドをoverrideして実装しようかとも思いました。
しかし、攻撃、回復の両方の効果を持ち、プレイヤーがどちらの効果を使用するかを選択できるようなカードも作成したいと思っているため、多重継承ができないC#では実装はできないのかなと思っています。

この場合は、攻撃カード用のインターフェースを実装した大半の攻撃カードの攻撃用メソッドそれぞれについて、Xを返すような処理を書いていくしかないのでしょうか。

何か良い方法があれば教えてください。

試したこと

Cardクラスを継承したAttackCardクラスを継承させて、攻撃用メソッドをOverrideさせようとした。
=>攻撃、回復など、複数の効果を選択できるカードを作成予定のため断念

TN8001👍を押しています

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

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

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

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

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

neconekocat

2021/06/15 03:51

インターフェースにすればいいだけでは?
hayamura.akito

2021/06/15 03:58

>>この場合は、攻撃カード用のインターフェースを実装した大半の攻撃カードの攻撃用メソッドそれぞれについて、Xを返すような処理を書いていくしかないのでしょうか。 上記の方法で実装するということでしょうか? 申し訳ありません、理解ができておらず、どの部分をインターフェースとして実装するかを教えていただいてもよろしいでしょうか。
neconekocat

2021/06/15 04:11

C#8以降になりますがデフォルト実装が追加されています。
退会済みユーザー

退会済みユーザー

2021/06/15 04:56

Unity の話であれば Unity のタグをつけてください。
hayamura.akito

2021/06/15 05:20

>>neconekocatさん ありがとうございます。 インターフェースに実際に動作するメソッドを利用できることを知りませんでした。 今後利用できる箇所があれば利用します。
hayamura.akito

2021/06/15 05:21

>>SurferOnWwwさん Unityは利用していません。 紛らわしい書き方であれば申し訳ありませんでした。
guest

回答2

0

ベストアンサー

カードの効果を大まかにいくつかに分けて実装しようとしており、(回復、攻撃など)

と考えていたら,攻撃にも回復にも使えるカードがあって,困る,と.

「困る」ならば,作っているものに対して,その実装方針がそぐわないのかもしれません.
そのままの方針を無理矢理維持せずとも,もっと簡単にやれないか? と,考えてみては.
多重継承のようなものに手を出さずとも,シンプルになるかもしれません.

例えば,以下のようなものがあれば十分なのかもしれません.

CSharp

1//「カードの効果」を処理するために必要となるゲームデータなどへのアクセス手段 2interface IXXX //(適切な名前をつけてね) 3{ 4 //(必要なメソッドを持つ) 5} 6 7//カードの効果 8interface ICardEffect 9{ 10 void Affect( IXXX GemeContext ); //効果を発揮する 11 string Text{ get; } //効果の説明とか 12} 13 14//カード 15interface ICard 16{ 17 //このカードが持つ効果群を得る 18 IEnumerable<ICardEffect> GetEffects(); 19}

投稿2021/06/15 04:24

編集2021/06/15 04:25
fana

総合スコア11660

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

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

hayamura.akito

2021/06/15 05:18

ありがとうございます。 今回はしていただいた方法で実装してみようと思います。 ゲームを作成するという目的よりも、インターフェースを使用するという手段のほうに重点を置いて考えてしまっていたかもしれません。
hayamura.akito

2021/06/15 08:07

ありがとうございます。 内容は難しくてまだ理解できていませんが、テスト用プログラムを作成して動きを確かめてみようと思います。
guest

0

インターフェイスのデフォルト実装を使えば多重継承はある程度実現できます。

投稿2021/06/15 04:06

gentaro

総合スコア8949

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

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

hayamura.akito

2021/06/15 05:17

ありがとうございます。 インターフェースに実際に動作するメソッドを利用できることを知りませんでした。 今回はfanaさんの手法で実装しようと思いますが、今後インターフェースのデフォルト実装が利用できる箇所があれば利用してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問