🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

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

Q&A

解決済

1回答

4210閲覧

抽象クラスまたはInterfaceで、実装を強制した共通処理を書く

UbiquitousD

総合スコア76

C#

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

0グッド

0クリップ

投稿2021/02/07 08:45

現在の状況

現在、継承と抽象クラス・Interfaceについて勉強しています。
記事もそこそこ読み、ある程度の使い方はわかってきたのですが、
もっといい方法はないかと思ったので質問させていただきます。

実現したいこと

抽象クラス、またはInterfaceを使い処理を強制したい。
ただ、強制する部分に共通する処理が多いので内部に処理を書きたい。

どういうことかといいますと、

スーパークラス

C#

1abstract class Monster 2{ 3 // モンスターを湧かせる抽象メソッド 4 protected abstract void Pop(); 5}

サブクラス①

C#

1class Slime : Monster 2{ 3 // スライムを湧かせる 4 protected override void Pop() 5 { 6 Console.WriteLine("スライムが現れた!"); 7 } 8}

サブクラス②

C#

1class Goblin : Monster 2{ 3 // ゴブリンを湧かせる 4 protected override void Pop() 5 { 6 Console.WriteLine("ゴブリンが現れた!"); 7 } 8}

このような構造があった場合に、スーパークラスを以下のように書き換えることで、
メソッドの実装自体は強制、ただし中身は殆ど同じ処理をさせる。
といったようなことをしたいです。

C#

1abstract class Monster 2{ 3 // モンスターを湧かせる抽象メソッド 4 protected abstract void Pop(string name) 5 { 6 Console.WriteLine(name + "が現れた!"); 7 } 8}

発生している問題

abstractは中身を宣言できないと読んだ記事に書いてあったので、その通りになった。
抽象クラスが使えないならInterfaceで実装しようと、

C#

1interface IMonsterPop 2{ 3 protected void Pop(string name) 4 { 5 Console.WriteLine(name + "が現れた!"); 6 } 7}

というコードを書いたが、これだと継承した時点でメソッドの実装が強制ではなくなってしまった。

質問は以上です。よろしくお願いします。

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

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

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

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

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

Zuishin

2021/02/07 08:49

Pop ではなく Name を abstract プロパティにし、Pop の中ではそれを呼ぶようにするのが良いと思います。
UbiquitousD

2021/02/07 08:59

ありがとうございます。その方法で解決できました。
Zuishin

2021/02/07 09:02

自分で回答してそれをベストアンサーに選んでください。
guest

回答1

0

自己解決

スーパークラス

C#

1abstract class Monster 2{ 3 protected abstract string name { get; } 4 5 public void Pop() 6 { 7 Console.WriteLine(name + "が現れた"); 8 } 9}

サブクラス①

C#

1class Slime : Monster 2{ 3 protected override string name => "スライム"; 4}

サブクラス②

C#

1class Goblin: Monster 2{ 3 protected override string name => "ゴブリン"; 4}

投稿2021/02/07 09:02

UbiquitousD

総合スコア76

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問