- PR -

コンポーネントクラスの公開を制御する方法

投稿者投稿内容
はなたれ小僧
常連さん
会議室デビュー日: 2003/07/17
投稿数: 21
投稿日時: 2004-12-25 12:17
VS.NET2003/C#でコンポーネントライブラリを作っているのですが、そのコンポーネント
クラスをカスケードに継承して必要なコンポーネントを作ったときに、このライブラリを
ツールボックスに追加しようとすると必要のない上位クラスまでがコンポーネント一覧に
すべて表示されてしまいます。クラスの宣言をprotectedにしようとすると怒られるので
何かの属性で非公開を指定するのではないかと想像しているのですが見つかりません。
どなたか正しい制御方法をご存知ではないでしょうか。

クラスライブラリは、ひとつの名前空間のひとつのプロジェクトの中で作っています。
はなたれ小僧
常連さん
会議室デビュー日: 2003/07/17
投稿数: 21
投稿日時: 2004-12-25 14:12
追加の質問です。
コンポーネントライブラリのプロジェクトにクラス継承の新しいファイルを追加しようと"追加"ダイアログを開いたときに、「継承されたフォーム」や「継承されたユーザコントロール」というテンプレートはあるのですが、「継承されたコンポーネント」というものがないのが気になっております。私は特にためらいもなく新しいコンポーネントクラスを追加し、そのクラス継承元を上位のコンポーネントクラスに変更して継承されたクラスを書いていますが、そもそも"1プロジェクトにつき1公開コンポーネント"というルールがそこに意図されているのでしょうか?
そうだとするとひとつのクラスの中でできるだけ詰め込んで書いてしまわないと大変コーディングが面倒になるような気がします。私の書き方で先の質問に示した点以外は特に機能的におかしなことはなく動作してはいるようなのですが。
壱丸3
常連さん
会議室デビュー日: 2004/09/13
投稿数: 34
投稿日時: 2004-12-25 14:38
internalではだめでしょうか?

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/csref/html/vclrfDeclaredAccessibilityPG.asp
はなたれ小僧
常連さん
会議室デビュー日: 2003/07/17
投稿数: 21
投稿日時: 2004-12-25 15:31
壱丸3さん、ありがとうございました。
internalはどきっとしましたが、上位クラスにinternalを設定するとそれを継承するクラスも一貫してinternalにしないとコンパイラに怒られてしまいました。

"CS0060:アクセシビリティに一貫性がありません。基本クラス 'class1' のアクセシビリティはクラス 'class2' よりも低く設定されています。"

少なくとも最下位のクラスはpublicにしたいのでうまくないようです。

COMの頃は選択的にレジストリに登録するコンポーネントを指定すればよかったのでこんな悩みを抱えることはなかったのですが。

菊池
会議室デビュー日: 2004/11/15
投稿数: 19
投稿日時: 2004-12-25 16:15

class A : IComponent
class B : A

 でAをコンポーネントとして使いたくないという事でしょうか?

class A
class B : A,IComponent

 としておけば良い気がしますが。
はなたれ小僧
常連さん
会議室デビュー日: 2003/07/17
投稿数: 21
投稿日時: 2004-12-25 18:03
菊地さん、ありがとうございます。
説明が少し足りなかったようですみません。

class AはすでにコンポーネントクラスとしてSystem.Windows.Forms.PictureBoxを継承して作り始めてあり、それをさらに継承していくつかのバリエーションクラスを作ろうとしています。したがって、後段のclass BだけにIComponentをくっつける訳にはいかないようです。コンポーネントが始祖クラスになっている限り作ったクラスは全部隠せないということでしょうか。

検索しまくっていますが、なかなか適切な解説にたどりつけません。
karajan
ベテラン
会議室デビュー日: 2002/07/05
投稿数: 89
投稿日時: 2004-12-25 23:30
ClassAはあくまで基底クラスということで、直接インスタンス化はしたくない、ということであれば、ClassAをAbstractクラスとして宣言すれば、ツールボックスにも表示されないかと。
はなたれ小僧
常連さん
会議室デビュー日: 2003/07/17
投稿数: 21
投稿日時: 2004-12-26 09:05
karajanさん、夜中にもかかわらずありがとうございました。
abstractをここで使えるとは考えませんでした。頭が柔軟でないといけませんね。

ついでに多段の継承を試してみました。

public class abstract A {....}
public class B : A {....}
public class abstract C : B {....}
public class D : C {....}

ツールボックスに追加しようとするとBとDだけが候補としてリストされます。このキーワードの追加だけで他にコーディングの組み立て上影響を受けるところもなく気持ちよく進められそうです。

スキルアップ/キャリアアップ(JOB@IT)