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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

1408閲覧

[c#]機能切り替えについて

saki_ABC

総合スコア13

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2018/07/11 01:29

###実現したいこと
c#のフォームプログラムについて、
ラジオボタンの状態によって通信方法を変更できるようにする。

###現状
インターフェースとしてシリアルポートが実装されているが、
追加でTCP/IP通信をサポートしたい。

インターフェース部はフォーム画面とは完全に分離している。
(シリアルポートの通信設定以外は、オープンやリードといった一般的な実装にしている)

インターフェース部にTCP/IP通信を追加したいのですが、
呼び出しメソッドはそのままに機能だけ変更することは可能かどうか。
(オープンのメソッドを呼び出したとき、ラジオボタンの状態によってセットアップされる通信方法を変更したい)

###実現方法

delegateで上記を実現可能ですか?
もし、他にいい方法が有れば教えてください。

よろしくおねがいします。

###環境
visual studio 2015
visual C#
.NET Framework 4.0

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

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

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

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

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

guest

回答1

0

ベストアンサー

そのためにクラスの継承というものがあります

何かからデータを読み出し、読み出したデータはこの形式で、このメソッドで返し、
送信のデータはこの形式でどのメソッドで渡す、というクラスを設計します。
そんで、そのクラスを、仮想クラスとして実装します>クラスA

で、そのクラスAを継承して、その通りに動くように、シリアル通信のクラスを実装します>クラスB
で、そのクラスAを継承して、その通りに動くように、TCP/IP通信のクラスを実装します>クラスC

あとは、クラスAを使って動いていろんな表示や入力するフォーム(あるいはクラス)を実装します

そのフォームのクラスAプロパティに、クラスBを突っ込むか、クラスCを突っ込むか、というはなしになりますね

投稿2018/07/11 01:42

y_waiwai

総合スコア87719

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

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

saki_ABC

2018/07/11 02:59

早速簡単ですが、勉強がてら実装してみました。 以下のような感じで実装すればよろしいですか? using System; namespace virtualclass { class Program { static void Main(string[] args) { Console.WriteLine("ここから");      //基底クラスで用意 open_base a = new open_base(); a.open(); a = new open_class1(); a.open(); a = new open_class2(); a.open(); Console.ReadKey(); } } //基底クラス class open_base { public virtual void open() { Console.WriteLine("This is base class"); } } //派生クラス class open_class1 : open_base { public override void open() { Console.WriteLine("override1"); } } //派生クラス class open_class2 : open_base { public override void open() { Console.WriteLine("override2"); } } } 実行結果: ここから This is base class override1 override2
y_waiwai

2018/07/11 03:29

まあ、そんな感じですね 関数単位で動作を切り替えるなら、デリゲートを使えばいいですが、 機能、という単位で動作を切り替える場合には、このようにクラスで切り替えればわかりやすくなります もうちょっと詳しく書いてみますと、基底クラスに要求されるメソッドとしては、 オープン/クローズ 送信データ書き込み/受信データ読み出し、 そして、受信データ到達を通知するイベント あたりを実装すれば用は足りますか。 クラスの継承となると覚えることがたくさん出てきますが、そこらへんのキーワードでぐぐると解説もでてきます。がんばってください。
saki_ABC

2018/07/11 04:04

ありがとうございます。 実装してみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問