- PR -

Forms部品の継承 クラスとデザイナクラスの関係

1
投稿者投稿内容
未記入
会議室デビュー日: 2004/08/31
投稿数: 12
投稿日時: 2007-02-23 13:39
Vb 2005 Express Editionを利用しています。

プロジェクトにWindowsフォームや、ユーザコントロールを追加とすると
クラス(.vb)と、Partialクラス(.Designer.vb)ができますよね。
これらと継承の関係について質問です。
#以後、クラスとPartialクラスと記述します。


今回、ベースとなる親Formクラスを作り、
このクラスを継承してアプリケーションクラスを作成するという構造にしたいと考えています。
親Formクラスでは、属性や、関数、継承元で実装すべき関数(MustOverride)を定義します。
デザインは、継承クラスで自由に設定してほしいです。(共通の表示項目はない)

プロジェクトにWindowsフォームを追加し、実装を行いました。
 Public MustInherit Class ParentForm・・・End Class
 Partial Class ParentForm Inherits System.Windows.Forms.Form・・・End Class


質問1.
 クラスで、MustOverride関数を定義すると、
 クラスをMustInheritにしなくてはいけないのはわかるのですが、
 PartialクラスはMustInheritにするべきなのでしょうか?


作成した親Formクラスを継承してアプリケーションを実装するために、
プロジェクトにWindowsフォームを追加し、
アプリFormのクラスを親クラスを継承する(Inherits)するようにしたら、
エラーになりました。
 Public Class AppForm Inherits ParentForm・・・End Class
 Partial Class AppForm・・・End Class
 <'AppForm' に指定された基本クラス 'ParentForm' は、その他の partial 型の
  1 つである基本クラス 'System.Windows.Forms.Form' と異なることはできません。>

逆に、Partialクラスだけ親クラスを継承したらエラーは出ませんでした。
 Public Class AppForm・・・End Class
 Partial Class AppForm Inherits ParentForm・・・End Class


質問2.
 クラスが親クラスを継承しなくてよいのはなぜでしょう?

質問3.
 アプリFormのデザイナを表示しようとしたら、エラーとなりました。
 <デザイナは型 'ParentForm' のインスタンスを作成しなければなりませんが、
  型が abstract として宣言されているため、作成できませんでした。 >
 アプリFormは、MustInheritではないのに、なぜ表示できないのでしょうか?
 このアプリFormを同じように継承してFormを作ると、そのデザイナはちゃんと表示されます。
 親クラスがインスタンス化できないとデザイナは表示できないのですか?

よろしくお願いします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-02-23 13:59
引用:

未記入さんの書き込み (2007-02-23 13:39) より:

逆に、Partialクラスだけ親クラスを継承したらエラーは出ませんでした。
 Public Class AppForm・・・End Class
 Partial Class AppForm Inherits ParentForm・・・End Class

引用:

質問1.
 クラスで、MustOverride関数を定義すると、
 クラスをMustInheritにしなくてはいけないのはわかるのですが、
 PartialクラスはMustInheritにするべきなのでしょうか?

引用:

質問2.
 クラスが親クラスを継承しなくてよいのはなぜでしょう?


これを読む限り、Partial クラスの意味を理解していないように思えます。
何だか、Partial クラスで分割したファイルを別々のクラスかのように勘違いをしていないでしょうか?
この 2 つのファイル (Partial クラス) は同じ 'クラス' を示しています。

引用:

親クラスがインスタンス化できないとデザイナは表示できないのですか?


はい。

[ メッセージ編集済み 編集者: じゃんぬねっと 編集日時 2007-02-23 14:00 ]
未記入
会議室デビュー日: 2004/08/31
投稿数: 12
投稿日時: 2007-02-23 14:46
引用:

じゃんぬねっとさんの書き込み (2007-02-23 13:59) より:

これを読む限り、Partial クラスの意味を理解していないように思えます。
何だか、Partial クラスで分割したファイルを別々のクラスかのように勘違いをしていないでしょうか?
この 2 つのファイル (Partial クラス) は同じ 'クラス' を示しています。




不勉強ですみません。

1つのクラスを複数のファイルに分けて定義する場合にPartialを利用するのですね。

ソリューションエクスプローラの表示のされ方からは、(.Designer.vb)が(.vb)一部のような印象をうけますが、
(.vb)にMustOverride関数を定義したのに、
(.Designer.vb)にMustInheritを宣言しなくてはいけないということは、
(.vb)が(.Designer.vb)の一部なんでしょうか?

質問1、2の回答?
 (.Designer.vb)にMustInherit,Inheritsを宣言すれば、(.vb)に宣言は必要ない。
 (.vb)にMustInherit,Inheritsを宣言した場合は、(.Designer.vb)に宣言が必要。

質問3の回答
 親クラスがインスタンス化できないとデザイナは表示できない
 #不便ですね。なにかよい方法はないものでしょうか。

じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-02-23 15:47
引用:

未記入さんの書き込み (2007-02-23 14:46) より:

ソリューションエクスプローラの表示のされ方からは、(.Designer.vb)が(.vb)一部のような印象をうけますが、
(.vb)にMustOverride関数を定義したのに、
(.Designer.vb)にMustInheritを宣言しなくてはいけないということは、
(.vb)が(.Designer.vb)の一部なんでしょうか?


いえ、MustInherit はどちらにでも修飾することが出来ますよ。

引用:

 (.vb)にMustInherit,Inheritsを宣言した場合は、(.Designer.vb)に宣言が必要。


え? そんなことはないと思います。

引用:

親クラスがインスタンス化できないとデザイナは表示できない
#不便ですね。なにかよい方法はないものでしょうか。


abstract (MustInherit) クラスをやめない限りは無理だと思います。
2005 になって何か抜け道があるかもしれませんが、私はとりあえず知らないです。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
1

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