質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
インターフェース

インターフェイスという用語はハードウェア・ソフトウェアの両方に使うことができます。 一般的に、インターフェイスは内部処理の詳細を見せないように設定されます。オブジェクト指向プログラミングにおいて、インターフェイスはabstractクラスとして定義されます。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

1回答

599閲覧

vb.net オブジェクト指向 抽象化

usm2030

総合スコア18

インターフェース

インターフェイスという用語はハードウェア・ソフトウェアの両方に使うことができます。 一般的に、インターフェイスは内部処理の詳細を見せないように設定されます。オブジェクト指向プログラミングにおいて、インターフェイスはabstractクラスとして定義されます。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2024/05/01 11:38

実現したいこと

共通処理をひとつのクラスに任せたいが抽象化させたい

formオブジェクトに保存ボタンコントローラがあるとする。
保存ボタンコントローラは保存という抽象メソッドを持ち、ボタンクリック時に処理を実行する
保存というクラスの実装はformオブジェクトのコードで行いたい。

発生している問題・分からないこと

例えば保存ボタンには保存しますか?というダイアログを出すだか、トランザクションを開始するだとか、何らかの共通処理があるが、共通処理はそのままに保存処理(バリデーションなども公開が考えられる)の中身だけform事に実装したい。

該当のソースコード

特になし

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

実現不可能だと思っていますが、いい方法はないですか?

コールバック関数を使うは思いつきましたが美しくありません。

(そもそも、フォームオブジェクト内でボタンオブジェクトがインスタンス化されている時点で、継承もクソもないのは承知しています。)

補足

例えば画面ごとに「削除」や「検索」の様なボタンがあったり、なかったりすると仮定して、
Inherits 保存ボタンクラス,削除ボタンクラス
のように書いて実装が必要なメソッドを切り替えられるようにしたい

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YAmaGNZ

2024/05/01 11:43

データを保持するクラスを用意して、そのクラスに保存メソッドや削除メソッド等を用意したほうがいいように思えます。 で、そのデータを扱う画面の保存ボタン等のイベントでそのデータクラスの保存メソッドを呼び出すとか
usm2030

2024/05/01 14:42

それはORM的な話(もしくは更にそのための中間クラスを作成?)ですかね? たしかに、無しでは無いですね。。。
YAmaGNZ

2024/05/01 22:22

UI部分を共通化したいといった話であればKOZ6.0さんの回答のようにフォームを継承するかユーザーコントロールを作成するといった手法があるのではないでしょうか。 ユーザーコントロールであれば、ユーザーコントロール内で「保存しますか?」等のUIロジックを組み込んで実際に保存可能となったら保存イベントを起こしてフォーム側で保存処理を行うとかできると思います。 バリデーションを公開する場合でもバリデーションが必要なタイミングでイベントを起こすとかバリデーションロジックをプロパティで設定するとかすればいろいろできそうです。
guest

回答1

0

ベストアンサー

継承元のフォームには様々なボタンを配置しておき、Click イベントで Protected Overridable なメソッドを呼ぶようにしておけばいいのでは?
ボタンは Protected 以上のスコープにしておけば、継承先のフォームでプロパティを操作できますので不要なら隠せばよいです。
以下はその一例です。

【継承元フォーム】
継承元フォーム

vb

1Public Class BaseForm 2 3 Public Sub New() 4 InitializeComponent() 5 End Sub 6 7 Private Sub SaveButton_Click(sender As Object, e As EventArgs) Handles SaveButton.Click 8 If ValidateOnSave() AndAlso ConfirmOnSave() = DialogResult.OK Then 9 OnBeginTransaction() 10 Try 11 OnSave() 12 OnCommit() 13 Catch ex As Exception 14 OnRollback() 15 End Try 16 End If 17 End Sub 18 19 Protected Overridable Function ValidateOnSave() As Boolean 20 Return True 21 End Function 22 23 Protected Overridable Function ConfirmOnSave() As DialogResult 24 Return MessageBox.Show("保存しますか?", "確認", MessageBoxButtons.OKCancel) 25 End Function 26 27 Protected Overridable Sub OnSave() 28 29 End Sub 30 31 Protected Overridable Sub OnBeginTransaction() 32 33 End Sub 34 35 Protected Overridable Sub OnCommit() 36 37 End Sub 38 39 Protected Overridable Sub OnRollback() 40 41 End Sub 42 43End Class

【継承先フォーム】(Label と TextBox を追加し、削除ボタンを隠す)
イメージ説明

実行すると
実行

投稿2024/05/01 18:16

編集2024/05/01 18:33
KOZ6.0

総合スコア2696

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

usm2030

2024/05/02 03:43

確かに! 隠すのは現実的で1番いい方法にも思えます。 ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問