よろしくお願い致します。
継承の動作を勉強しております。動作自体は確認出来ました。
継承後のメソッドでフォーム上のコントロールにアクセスする方法はありますか?
例えば「label1.text = "~"」の様に動作させたいです。
現在、2つのファイルに3つのクラス(そもそもここが間違ってる?)を書いてあります。
----- 1つめのファイル(Formのクラス) -----
Public Class Form8
Private Sub Button1_Click(~) Handles Button1.Click
Dim c As New check1
c.test()
End Sub
End Class
Public Class check1
Inherits Class1
Public Overrides Sub test()
Trace.WriteLine("Overrides")
'label1.text = "動作OK" ←こんな感じに実装したい
End Sub
End Class
----- 2つめのファイル(クラス) -----
Public MustInherit Class Class1
Public MustOverride Sub test()
End Class
フォームクラスの外で「label1.text = ""」のように書いてもアクセス出来ないのはわかります。
フォームクラスのファイル中にもうひとつクラスを書いてしまっているのが悪いのもわかります。
この辺りをどのように実装したらよいでしょうか。
わかりづらくて申し訳ありません。
ご指導よろしくお願い致します。
No.6ベストアンサー
- 回答日時:
おはようございます
ご報告ありがとうございます。
頑張りましたね~
これで完成でしょうか?
kutsusuzuさんがぜ~んぶご自分で考えて、ぜ~んぶご自分で書いてしまいましたね。
スゴ~い
>継承したクラスをフォーム内に入れてみました。
クラスを入れ子にしたかったんんですね。
蛇足です。
1番目
Form8.Label1.text = "動作OK"
と記入する方法と
2番目
Dim f As New Form8 '新しいオブジェクトを作成する
f.Label1.Text = "動作OK" '新しいオブジェクトのLabel1に"動作OK"を記入する
f.Show() '新しいオブジェクトを表示
上記のように書く方法の2種類があります、VB.NETから始めた人はFormもクラスとして(Class Form8と書かれているため)扱うため、2番目のようにクラスを呼び出す方法を使いますが、VB6から移行した人には、1番目の方法を使うようです。
私は、VBははじめて1年そこそこですので昔のことはわかりませんが、2番目の方法を使っています。
また、1番目の方法では内部で、Newしているらしいですが、フォームの表示の仕方から内部処理では何か特別な方法を使っているように感じます。
>こういう書き方をしていいものか…。したことがないので分かりません。
クラスを入れ子にすることや、Form8.Label1.text = "動作OK" のように書くことはkutsusuzuさんの目的の動作が達成されれば全く問題がないと思います。
あとは、他の方が良い回答をしてくださるのを期待しましょう。
(やっぱり他力本願です)
この回答への補足
bybalsendercase様、ありがとうございます。
アドバイス頂きました書き方でも実現できるのですね。
私の理解力不足で申し訳ありませんでした。
すでにバレてしまいましたが、10年以上前にVB6を触っておりました。
当時はクラスなどを使わずに作っておりましたのですべてが新鮮です。
ご指導有難うございました。
No.5
- 回答日時:
>お気遣いありがとうございます。
理解しづらいサンプルでした。
ごめんなさい。
この回答への補足
とんでもございません。サンプルありがとうございます。
私にはまだすぐに理解するほどの能力がありません…。
とりあえず!ですが、動作するものが出来ました。
No.3の補足より、継承したクラスをフォーム内に入れてみました。
----- 1つめのファイル(Formのクラス) -----
Public Class Form8
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim c As New check1
c.Method1()
End Sub
Public Class check1
Inherits Class1
Public Overrides Sub Method3()
Trace.WriteLine("動作OK")
Form8.Label1.text = "動作OK" ←動作しました!
End Sub
End Class
End Class
こういう書き方をしていいものか…。したことがないので分かりません。
とりあえず希望する動作を確認できましたのでご報告致します。
No.4
- 回答日時:
すいません
またやっちゃいました。
オーバーライドするのを忘れました。
Class Form8側を変更してください。
Public Class Form8
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim c As New check1
c.Method3()
Me.Close()
End Sub
End Class
Public Class check1
Inherits Class1
Public Overrides Sub Method3()
'継承の部分は何も機能の追加等はしてません
'基底クラスのメソッドを呼び出しているだけです
MyBase.Method3()
End Sub
End Class
Public Class Class1
Public Sub Method1()
'何も書いてません。
End Sub
Public Sub Method2()
'何も書いてません。
End Sub
Public Overridable Sub Method3()
Dim f8 As New Form8
f8.Label1.Text = "動作OK"
f8.Button1.Text = "表示"
f8.Show()
End Sub
End Class
No.3
- 回答日時:
お返事有難うございます、画像も有難う御座います。
(綺麗ですよ)他力本願作戦でしたが、どなたも回答してくださらないので、もう1度投稿させて頂きました。
>申し訳ありません。完全に私の文章力の無さが原因です。
それはないと思います。以前にも質問の内容がわからず、他の方が回答してくださった後「そ~ゆ~ことね」見たいな事がたびたびありました。
>Formの中からClass1の「あるメソッド」を置き換える。
ごめんなさい、”「あるメソッド」を置き換える。”の意味がわかりません。
Formの中からClass1の「あるメソッド」を呼び出すという意味でいいでしょうか?
>置き換え後のメソッドからフォーム上のコントロールにアクセスしたい。
この意味は
お礼欄の「このMethod3'からForm上に置いたコントロールにアクセスしたいです。」と同じ意味でいいですか?
>泣きたいです。
がんばって~
>2つのファイルに3つのクラス(そもそもここが間違ってる?)
いいと思いますよ、私はインテリセンスを表示したいだけのクラスはいつも、どこかのクラスの下に書いてます、小さいクラスを全部別ファイルにすると、収集がつかなくなりますね。
継承でMustInheritは必須ですか?
メソッド名は全てtest(同じ名前)にする必要がありますか?
Public Overrides Sub test()
Public MustOverride Sub test()
上記は、同一名のメソッドですね。
画像のMethod1とMethod2は無視でも構いませんか?
Method3'からForm8のラベルとボタンの表示を変更する、単純なサンプルを掲載しますので、できる範囲で結構ですので、kutsusuzuさんの目的の動作とどのように違うのか、教えて頂けるとうれしいです。
このようなやり取りをしているうちに、他の方が良い回答をしてくださると思います。
Public Class Form1
'シャットダウンモードを「最後のフォームが閉じるとき」にしてあります
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Shown
Dim f8 As New Form8
f8.Show()
Me.Close()
End Sub
End Class
Public Class Form8
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim c As New check1
c.test()
Me.Close()
End Sub
End Class
Public Class check1
Inherits Class1
Public Sub test()
'継承の部分は何も機能の追加等はしてません
'基底クラスのメソッドを呼び出しているだけです
MyBase.Method3()
End Sub
End Class
Public Class Class1
Public Sub Method1()
'何も書いてません。
End Sub
Public Sub Method2()
'何も書いてません。
End Sub
Public Sub Method3()
Dim f8 As New Form8
f8.Label1.Text = "動作OK"
f8.Button1.Text = "表示"
f8.Show()
End Sub
End Class
この回答への補足
bybalsendercase様、何度もすみません。
お時間をお取り頂き申し訳なく思います。
>ごめんなさい、”「あるメソッド」を置き換える。”の意味がわかりません。
Formの中からClass1の「あるメソッド」を呼び出すという意味でいいでしょうか?
はい。その意味です。
Form上で「Class1のMethod3」を「Class1のMethod3’」に置き換えて使いたいです。
>この意味は
お礼欄の「このMethod3'からForm上に置いたコントロールにアクセスしたいです。」と同じ意味でいいですか?
はい。その意味です。
>いいと思いますよ、私はインテリセンスを表示したいだけのクラスはいつも、どこかのクラスの下に書いてます、小さいクラスを全部別ファイルにすると、収集がつかなくなりますね。
問題の1つが解決しました。有難うございます。
>継承でMustInheritは必須ですか?
はい。そうしたく思います。
>メソッド名は全てtest(同じ名前)にする必要がありますか?
Public Overrides Sub test()
Public MustOverride Sub test()
上記は、同一名のメソッドですね。
継承する場合は「同じメソッド名+同じ引数」にしなければならないと書いてありました。
メソッドをごっそり入れ替えたいので同じ名前にしました。
>画像のMethod1とMethod2は無視でも構いませんか?
1つだけ欲しいです…。実はMethod1中でMethod3(実運用はMethod3’)を呼ぶからです。
ご指導いただきましたコードの
Public Sub Method3()
Dim f8 As New Form8
f8.Label1.Text = "動作OK"
f8.Button1.Text = "表示"
f8.Show()
End Sub
↑コントロールにアクセスする部分を、Class1内ではなく、Formの方へ持って行きたいです。
少し書きなおしてみました。
Class1を継承したcheck1の中からコントロールにアクセスすることが目的です。
----- 1つめのファイル(Formのクラス) -----
Public Class Form8
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim c As New check1
c.Method1()
End Sub
End Class
Public Class check1
Inherits Class1
Public Overrides Sub Method3()
Trace.WriteLine("動作OK")
'Label1.text = "動作OK" ←こんな感じに実装したい
End Sub
End Class
----- 2つめのファイル(クラス) -----
Public MustInherit Class Class1
Public Sub Method1()
Call Method3()
End Sub
Public MustOverride Sub Method3()
' 置き換え専用
End Class
No.2
- 回答日時:
すいません
1箇所変なものを付けてしまいました。
Me.Text &= txt & "動作OK"→ Me.Text = txt & "動作OK"
私の回答は役に立ちませんが一応訂正しておきます。
ご迷惑おかけしました。
No.1
- 回答日時:
こんばんは
すいません、読解力不足でkutsusuzuさんの質問の内容を理解しておりません。
単純なサンプルを掲載しますので、どこがどのようにkutsusuzuさんの目的と違うのか教えてください。
単純にlabelをクラスとして継承しているだけです。
Public Class splabel
Inherits Label
Public Sub addtxt(ByVal txt As String)
Me.Text &= txt & "動作OK"
End Sub
End Class
Public Class Form1
Private Sub f1() Handles MyBase.Shown
Button1.Text = "表示"
Splabel1.Text = ""
End Sub
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
Dim st As String
st = TextBox1.Text
Splabel1.addtxt(st)
End Sub
End Class
お手数おかけします、いろいろ詰めていくうちに、他の方が良い回答をしてくださると思います。(完全に他力本願)
この回答への補足
bybalsendercase様ご回答有難うございます
>すいません、読解力不足でkutsusuzuさんの質問の内容を理解しておりません。
申し訳ありません。完全に私の文章力の無さが原因です。
目指すことは、
・Formの中からClass1の「あるメソッド」を置き換える。
・置き換え後のメソッドからフォーム上のコントロールにアクセスしたい。
そもそもこんな使い方は一般ではない、間違っている等の場合もありますが、
よろしくお願いいたします。
画像を貼り付けてみました。
ペイントで作ったので汚くて申し訳ありません。
Class1のMethod3を
FormのMethod3'で置き換えるような事をしたいです。
このMethod3'からForm上に置いたコントロールにアクセスしたいです。
ほんとに説明が下手くそで…。泣きたいです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・【お題】絵本のタイトル
- ・【大喜利】世界最古のコンビニについて知ってる事を教えてください【投稿~10/10(木)】
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【C#】抽象クラスでコンパイル...
-
オブジェクト指向の特徴
-
Javaのインスタンス化の構文の...
-
VB DLLプロジェクトについて
-
【C#】クラスのコンストラクタ...
-
SQLiteOpenHelperの実行タイミ...
-
(vba)他のアプリケーションの右...
-
javaでクッキー認証を必要とす...
-
【.NET】コンストラクタをあと...
-
インタフェース、クラスの継承...
-
c++でのヘッダーファイルの循環...
-
Javaの自作例外クラスについて
-
クラス間の値渡しの仕方
-
setTextについて
-
抽象クラスとインターフェース...
-
「タイプ初期化子が例外をスロ...
-
エクセルVBAで、条件に一致する...
-
複数の変数を宣言する時、同時...
-
変数名の付け方
-
インスタンス参照でアクセスで...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB DLLプロジェクトについて
-
interface,extend,implementの...
-
(vba)他のアプリケーションの右...
-
「ラッパークラス」の存在意義...
-
JTextFieldの入力制限
-
C# 「データが失なわれる可能性...
-
オーバーライドとラッパーの違い
-
【C#】クラスのコンストラクタ...
-
「継承されたメソッドの可視性...
-
抽象クラスをJUNITでテストする...
-
c++でのヘッダーファイルの循環...
-
スタックで成績表を作るプログ...
-
C#からDLLを呼びたいのですが・...
-
setTextについて
-
javaの「型」がよくわかりません。
-
インナークラスについて
-
委譲って何ですか?
-
Commons-Discovery.jarとは?
-
WPF C# PointToClient
-
「IOException は対応する try ...
おすすめ情報