私はこの問題の解決策を見つけるために今いくつかを見回しました。私はそれを解決できるいくつかの方法を見つけましたが、正直なところ、それを解決する「正しい」C#またはOOPの方法と見なされる方法のどれかを知りませんでした。私の目標は、問題を解決するだけでなく、優れたコード標準のセットを開発することでもあり、この問題を処理するための標準的な方法があると確信しています。
それぞれのクラスと通信方法を備えた2種類のプリンタハードウェアがあるとします。PrinterType1、PrinterType2です。
また、必要に応じて、後で別のタイプを追加できるようにしたいと思います。抽象化の一歩は、それらに多くの共通点があります。例として、それぞれに文字列を送信できるはずです。どちらにも共通の変数と各クラスに固有の変数があります。(たとえば、1つはCOMポートを介して通信し、そのようなオブジェクトを持っていますが、もう1つはTCPを介して通信し、そのようなオブジェクトを持っています)。
ただし、これらすべてのプリンターのリストを実装し、リストを調べて、タイプに関係なくすべてのプリンターで「送信(文字列メッセージ)」として実行できるようにしたいと思います。また、両方のオブジェクトで同じ「PrinterList [0] .Name」のような変数にアクセスしたいのですが、オブジェクト自体に固有のデータにアクセスしたい場所もあります(たとえば、の設定ウィンドウであるオブジェクトにCOMポート名が設定され、別のオブジェクトにIP /ポート番号が設定されているアプリケーション)。
つまり、簡単に言うと、次のようになります。
共通:
- 名前
- 送信()
PrinterType1に固有:
- ポート
PrinterType2に固有:
- IP
たとえば、存在するオブジェクトのタイプや数に関係なく、すべてのオブジェクトに対してSend()を実行したいと思います。
ポリモーフィズム、ジェネリックス、インターフェイスなどについて読んだことがありますが、基本的に、これがC#(および/または一般的なOOP)で通常どのように処理されるかを知りたいと思います。
私は実際に基本クラスを作ろうとしましたが、それは私にはまったく正しくないようでした。たとえば、基本クラス自体で「string Send(stringMessage)」関数を使用していません。では、そもそも基本クラスの関数を使用しないのに、派生クラスでオーバーライドする必要があるものを定義するのはなぜですか?
どんな答えにも本当に感謝しています。このあたりの人々は非常に知識が豊富で、この場所は私に多くの解決策を以前に提供してくれました。今、私はついに答えて投票するためのアカウントを手に入れました。
編集:
さらに説明すると、実際のプリンタータイプのオブジェクトにもアクセスできるようにしたいと思います。たとえば、SerialPortオブジェクトであるPrinterType1のPort変数。次のようにアクセスしたいと思います。
PrinterList[0].Port.Open()
基盤となるポートのすべての機能にアクセスできます。同時に、さまざまなオブジェクトに対して同じように機能するジェネリック関数を呼び出したいと思います(ただし、実装は異なります)。
foreach (printer in Printers)
printer.Send(message)