DOBON.NET DOBON.NETプログラミング掲示板過去ログ

継承がわかりません

環境/言語:[XP]
分類:[.NET]

VB.NETの基本的な機能で継承がありますが、具体的にどうしたらいいのかがわかりません。

VB.NETの「新しい項目の追加」で「Windowsフォーム」を追加すると、追加したフォームはすべて自動的にClassとなります。

クラス名は、とくに名称を変更しなければ「Form1」、「Form2」のように数値部分がひとつずつ繰り上がりますが、この場合、Form1で「Inherits Form2」とするとエラーになります。逆も同様です。

Form1の部品的な意味合いでForm2を使うことを目的として「継承」をできるかと思ったのですが、こういうことはできないのでしょうか?
ご存じのかた、よろしくお願いします。
部品化と継承とは意味が違います。説明しだしたらきりが無さそうですが、オブジェクト指向(クラスの概念)をまずはしっかりと学んでください。
ちなみに、Form1はFormを継承していますし、Form2もFormを継承しています。Form1がForm2を継承すると、Form1はFormとForm2を継承することになってしまいます。VBではこのように複数を継承することは許されていません。C#もです。理由は、多重継承などのキーワードで調べてみて下さい。
> ちなみに、Form1はFormを継承していますし、Form2もFormを継承しています。Form1がForm2を継承すると、Form1はFormとForm2を継承することになってしまいます。VBではこのように複数を継承することは許されていません。

確かにこれは書かれていました。

デザイン画面で部品をデザインして、それをフォームに載せるという方法は不可能ということでしょうか?

たとえばForm上にPictureBoxやTextBox等を載せることができますが、自分でデザインしたオブジェクトに対してこれと同様のことをやりたいのです。
不可能でしょうか?
■No18636に返信(VINさんの記事)
> この場合、Form1で「Inherits Form2」とするとエラーになります。

これだけならば、コンパイル エラーにはならないでしょう。
VB2005 の場合、Partial 側で Inherits System.Windows.Forms.Form となっているのでエラーになるだけです。
(これは、単一継承ではなく多重継承なので叱られると)

> Form1の部品的な意味合いでForm2を使うことを目的として「継承」をできるかと思ったのですが、こういうことはできないのでしょうか?

部品ではなく継承をすることによって、公開メンバの機能を引き継ぐことはできます。

> 逆も同様です。

お互いを継承し合うことはできません。
継承関係ができると、一方が基底クラス、一方が子クラスという親子関係ができるからです。

あなたの親からあなたは生まれていますが、そのあなたが親を生むことはできませんよね。

Form1 でも Form2 でも同じロジックを使いたいのであれば、
汎用的なクラスを 1 本書いて、それをどちらからでも使えば良いでしょう。

Form1 でも Form1 でも機能を継承したいのであれば、
Base となる Form クラスを設計し、Form1 と Form2 両方で継承します。
■No18639に返信(VINさんの記事)
> デザイン画面で部品をデザインして、それをフォームに載せるという方法は不可能ということでしょうか?
>
> たとえばForm上にPictureBoxやTextBox等を載せることができますが、自分でデザインしたオブジェクトに対してこれと同様のことをやりたいのです。
> 不可能でしょうか?

これは、「ユーザーコントロール」 の役割でしょう。
  • 題名: Re[1]: 継承がわかりません
  • 著者: とりこびと
  • 日時: 2006/12/27 17:14:06
  • ID: 18642
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
こんにちは。

■No18636に返信(VINさんの記事)

> クラス名は、とくに名称を変更しなければ「Form1」、「Form2」のように数値部分がひとつずつ繰り上がりますが、この場合、Form1で「Inherits Form2」とするとエラーになります。逆も同様です。

エラーというのがちょっと気になったのですが、Visual Basicのバージョンは.NET 2003 でしょうか?2005でしょうか?(多分2005かと。)

.NET 2003 であれば、Form1.vb というファイルに

Public Class Form1
Inherits System.Windows.Forms.Form

って自動生成されていると思いますので、

Public Class Form1
Inherits Form2

に変更すれば Form2 を継承したことになります。

2005 であれば、Form1.Designer.vb というファイルに

Partial Class Form1
Inherits System.Windows.Forms.Form

って自動生成されていると思いますので、

Partial Class Form1
Inherits Form2

に変更すれば Form2 を継承したことになります。

おそらく2005でForm1.vb にInherits Form2を書かれたのだと思われますが、
Form1.Designer.vb に自動生成される Inherits System.Windows.Forms.Form
と継承元が2つ存在してしまうためエラーが出たのではないでしょうか。(Visual Basicでは多重継承できません。)

もし、Form1.Designer.vb がプロジェクトに見つからなければ、ソリューションエクスプローラで[すべてのファイルを表示]してみてください。

Partialというキーワードも調べてみたらいいのではないかと思います。

見当違いでしたらすみません。
>>たとえばForm上にPictureBoxやTextBox等を載せることができますが、自分でデザインしたオブジェクトに対してこれと同様のことをやりたいのです。
>>不可能でしょうか?
>
> これは、「ユーザーコントロール」 の役割でしょう。

ということは、継承の概念を間違えてとらえていたようです。
コントロールのようなものをフォームを使ってデザインしたら、それを「Inherits」とすることで利用できると思いこんでいました。
いずれにしましても、じゃんぬさんととりこびとさんのご指摘、試させていただきます。
ありがとうございました。

DOBON.NET | プログラミング道 | プログラミング掲示板