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

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

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

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

オブジェクト指向

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

Q&A

3回答

4636閲覧

【C#】継承元のコンストラクタ内で実施する処理を変更したい

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

オブジェクト指向

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

0グッド

2クリップ

投稿2019/05/09 02:50

編集2019/05/10 02:38

いつもお世話になっております。

本日は、
親クラスを継承した子クラスが生成される際の、

  1. 親クラスのコンストラクタ実行
  2. 子クラスのコンストラクタ実行

の処理で、①の処理を変更する方法について質問です。
分かりにくいため、以下にサンプルコードで説明致します。

C#

1public class ParentClass 2{ 3 /// 定数のサンプル 4 private const int DefineSample = 12000; 5 6 public ParentClass() 7 { 8 // ※コンストラクタ内で DefineSample を使用する 9 } 10}

<前提条件>

  • 親クラス(ParentClass)は、定数DefineSampleを持っている。
  • 親クラス(ParentClass)は、コンストラクタ内で上記の定数を使用した処理を実施する。
  • 子クラスは、親クラス(ParentClass)を継承したい。

(親クラス・子クラスで共通の処理があるため)

  • 子クラスでは、親クラス(ParentClass)の定数(DefineSample)を変更する必要がある。
  • 定数(DefineSample)は、親クラス内のさまざまな箇所で使用されているため、値を保持する必要がある。

この条件において、自分が考えている実現方法は以下です。

C#

1public class ParentClass 2{ 3 /// 定数のサンプル 4 //private const int DefineSample = 12000; 5 protected virtual int DefineSample => 12000;//プロパティに変更 6 7 public ParentClass() 8 { 9 // ※コンストラクタ内で DefineSample を使用する 10 } 11 } 12 13public class ChildClass : ParentClass 14{ 15 protected override int DefineSample => 530000;//override 16 17 public ChildClass() : base() 18 { 19 } 20}

<修正案①>

  • 定数はOverrideできないため、親クラス(ParentClass)の定数をプロパティに変更する。
  • 子クラスでは、プロパティをOverrideし、子クラスで使用する値に変更する。

これにより、子クラス生成時には、
子クラスで再定義したDefineSampleを使用し、親クラスのコンストラクタを実行
→子クラスのコンストラクタを実行
という流れになると考えています。

★質問
上記以外の修正方法があればご教授願いたいです。

説明が拙く、申し訳ありませんが、よろしくお願いいたします。

<環境>
言語:C#(.Net Framework 4.5.2)

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

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

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

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

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

hihijiji

2019/05/09 03:16

ご提示の修正案で問題ないと思いますが、何か懸念があるのでしょうか?
退会済みユーザー

退会済みユーザー

2019/05/10 02:34

実際はもっと複雑なコードで、結構苦労して考えたものなので、 もっと他に理想的な方法がないだろうか・・・?と疑問に思ったものです。 やりたいことは実現できており懸念はないのですが、もっとスマートな方法はないか知りたかったため、質問させていただきました。
guest

回答3

0

C#

1public class ParentClass 2{ 3 private readonly int DefineSample; 4 5 public ParentClass() : this(12000) { } 6 protected ParentClass(int Sample) { 7 DefineSample = Sample; 8 Console.WriteLine($"{DefineSample}"); 9 } 10} 11 12public class ChildClass : ParentClass 13{ 14 public ChildClass() : base(530000) { } 15} 16

こうすれば、
ParentClass(int)を外部から使うことが出来なくなりますので、ParentClassをnewしたときは必ず12000で実行できます。

投稿2019/05/09 03:33

YAmaGNZ

総合スコア10258

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

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

退会済みユーザー

退会済みユーザー

2019/05/10 02:46

回答ありがとうございます! 確かにコンストラクタの設計を変えれば実現可能ですね。勉強になります。 こちらの回答をいただいてから、もう1点前提条件があることに気付きました(後出しですみません。質問文には追記しました)。 ・定数(DefineSample)は、親クラス内のさまざまな箇所で使用されているため、値を保持する必要がある。 これを満たすには、さらにコンストラクタ内で与えられた引数をメンバ変数に格納し、保持する必要があるのかと思いました。 ご回答ありがとうございました!
YAmaGNZ

2019/05/10 02:55

現状の回答で値の保持を行っていますので条件は満たしているかと思います。
退会済みユーザー

退会済みユーザー

2019/05/10 03:52

失礼致しました。定数と見間違いました。確かに満たしておりました。 補足ありがとうございます!
guest

0

・子クラスは、親クラス(ParentClass)を継承したい。
(親クラス・子クラスで共通の処理があるため)

という前提条件なので、回答は別の方のままで大丈夫だと思いますが、考え方として「子クラスが親クラスの内部処理を意識した」時点で、継承を使うという発想が間違いかもしれない、と考えてみた方が良いかもしれません。

特に、処理の共通化という目的が先にあって、継承という手段を使うのは、間違いのケースが多いです。

例示されたコードだけだと、コンストラクタ引数で渡された初期状態が異なる、同一クラスの別インスタンスで良いのではないか、とも思えます。

今回は詳細がわからないので、ひょっとしたらis-a関係はちゃんと成立しており、継承を使うのが正しいのかもしれませんので、その場合はすみません。無視してください。

投稿2019/05/17 11:34

gentaro

総合スコア8949

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

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

0

親をこうしておけば…

csharp

1public class ParentClass 2{ 3 private const int DefineSample = 12000; 4 5 public ParentClass( int Sample = DefineSample ) 6 { 7 ...//引数Sampleの値を参照する 8 } 9}

子は引数で与えれられる.

csharp

1public class ChildClass : ParentClass 2{ 3 public ChildClass() : base(53000) {} 4}

投稿2019/05/09 03:07

編集2019/05/09 03:08
fana

総合スコア11658

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

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

退会済みユーザー

退会済みユーザー

2019/05/10 02:49

回答ありがとうございます! この引数の与え方はあまり使用したことがなく、思い浮かびませんでした。勉強になります! もう一方のご回答にもお返ししたのですが、 回答をいただいてから、もう1点前提条件があることに気付きました(後出しですみません。質問文には追記しました)。 ・定数(DefineSample)は、親クラス内のさまざまな箇所で使用されているため、値を保持する必要がある。 こちらも、与えられた引数をメンバ変数に格納して保持すれば実現できると考えました。 ご回答ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問