• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:c# 基本クラスの空っぽのプロパティ)

c# 基本クラスの空っぽのプロパティ

このQ&Aのポイント
  • c#初心者のための基本クラスのプロパティについての質問です。
  • 基本クラスには、値を設定しても何も起らないプロパティが存在することがあります。
  • 継承先で実装されるが、基本クラスでは抽象になっていないプロパティについて、初心者は使うべきではないのか疑問です。

質問者が選んだベストアンサー

  • ベストアンサー
  • kekyo0
  • ベストアンサー率62% (5/8)
回答No.1

非常に難しい問題だと思います。 まず、定義されているのに使用されないプロパティやメソッドは、その仕様を知らない使用者にとっては、意外な結果をもたらす可能性があります。 プログラム全体が十分安定的になって(もうコードを改良することもないほど練られている)も、まだこのようなメンバ定義が残っている場合、全体的な構造に欠陥がある可能性があります。 #アジャイルソフトウェア開発では、しばしは「不吉な匂い」と表現されます。 しかし、そうだとしても定義されていなければならない場合もあります。Controlクラスの場合、Controlクラス自身は全く意味をなしていないメンバですが、これを継承した様々なコントロールクラスは、オーバーライドして意味を持っている事が多くなります。 これが多数(つまり、Control自身は無意味な実装だが、派生クラスのほとんどには何らかの意味付けがされている)の場合は、不吉な匂いがするからといって、このような定義を排除するのは難しいでしょう。 もし、Controlクラスを自分が実装しているとして: よりベターなステップとして、まずこのようなメンバはインターフェイス定義に逃がすことが考えられます。AutoSizeプロパティを、ISizeableControlインターフェイスに定義し、これを実装するようにします。当然、Controlクラスには無意味なので、Controlクラスには実装しません。サイズ変更が意味を持つクラスにのみ実装するようにします。 「自動的にサイズ変更可能にするかどうかをチェックボックスで設定させる」フォームを作ったとします。このフォームのコンストラクタに、ISizableControlを渡すことで、フォーム内部でAutoSizeプロパティを制御できるようにします。すると、サイズ変更できるコントロールだけが、このフォームで制御可能になります。無関係なControlクラスを渡す事は出来ません。 更には、Controlを継承しているかどうかに関係なく、どのようなクラスでもISizableControlを実装していれば、フォームで同じように制御出来るようになります。 別の方法としては、コントロールのサイズ変更処理をControlクラス(とその派生クラス)内で行うのではなく、別のクラスで受け持つようにします。実際のSystem.Windows.Forms.Controlクラスではうまく説明できませんが、ウインドウメッセージを別の新しく作ったクラス、例えばSizeControllerクラスに転送(メソッド呼び出しなどで)し、そこでサイズ変更に関するさまざまな処理を行うというものです。これを「処理の委譲」と呼びます。 処理を委譲すれば、AutoSizeプロパティはSizeControllerクラスに移動できます。あとはどのようにSizeControllerクラスを実際のクラス(Controlを継承したクラス)に渡すか、という事だけを考えれば済みます。AutoSize以外にも、サイズ変更に関する様々なプロパティやメソッドは、SizeControllerクラスに定義すればよく、Controlクラスが不必要に膨れ上がることを防ぐことが出来ます。 #なお、現実のSystem.Windows.Forms.Controlクラスは、上記のような基本的な設計以外にも、単に「理解しやすい」(これも重要な要素)、デザイン時編集機能のサポートの問題などがあって、あのようになっているのではないかと推測しています。 #特にインターフェイス分離や委譲が多くなると、全体として何をするのかが分かりにくくなるというデメリットがあります。拡張性の高さ・保守の容易性・テスト容易性などとのトレードオフです。

koumei000
質問者

お礼

 なるほど、なかなか大変だということは分かりました。  初心者にはまだ手をつけないで何とかする方法を探したほうがいいような気がするので、今回は別の方法で何とかしてみます。  回答ありがとうございました。

関連するQ&A