2016-04-01 5 views
1

iは、一般的にはC#またはOOPに新たなんだと思っていた次の継承で可能である場合:隠す派生クラス

私は、通信リンク設定したいとUDPまたはシリアル通信を使用できるようにしたいです。 だから、私は2クラス「LinkUdp」と「LinkSerial」を導出し、4つの方法今

をオーバーライドし、この基本クラスから.close、.openメソッドを抽象基底クラス「リンク」を定義し、.send、.receive オブジェクトを持つコードを 'Link'クラスに直接書くことは可能ですか?私は次のようになります:

リンクmyLink = new Link( "10.0.0.1"); //今コンパイラは LinkUdpクラスを使用することを知っています
リンクmyLink = new Link( "COM1"); //コンパイラは

や私のように専用の私のコードを記述する必要がありますLinkSerialクラスを使用する を知っている:

LinkUdp myLink =新LinkUdp( "10.0.0.1")。これは十分に明確である

希望... おかげ

編集: iは、2つの異なる実装を記述することなくので、私は、サブクラスにオブジェクトを渡すことができます「リンク」クラスを使用したいです: ので、この後、私はクラスを持っている

CommunicationHandler myComm =新しいCommunicationHandler(myLink)。

、その後、このハンドラは、UDPまたはシリアル使用して、私を心配する必要はありません...

+0

私はあなたが工場出荷時のパターンはhttp://www.dofactory.com理解するために、このリンクを使用し実装すると思います/ net/factory-method-design-pattern – rashfmnb

+0

'Link'が抽象クラスである場合、そのインスタンスを直接作成することはできません。 '新しいリンク(...)'は無効です。 –

答えて

1

コンパイラは、単に変数名に基づいてインスタンス化する種類を選択できるようにする方法はありません(しない限り、リフレクションまたはファクトリを使用して適切なインスタンスを作成します)。

しかしこれは可能であり、それは継承の利点の一つを示しています

Link myLink; 
myLink = new LinkUdp("10.0.0.1"); 
myLink = new LinkSerial("10.0.0.1"); 

どんなに以下では、myLinkはそれらのいずれかになることはできません。使用されるタイプはLinkであり、アプリケーションを可能な限り汎用的にすることができます。

+0

上記の私の編集と同様に、私はこのmyLinkを別のメソッドに渡すことができ、たとえばmyLink.Open()を呼び出す際に問題はありません。 LinkUdp.Open()とLinkSerial.Open()の両方が存在する限り?それは私の問題に対する答えになるはずです。ありがとう – JakkeFire

+0

はい、それについての心配はありません。あなたのパラメータの型として 'Link'を使用してください。 –

+0

これらのメソッドは、基底クラスで定義されている必要があります。派生クラスに実装された 'abstract'もあるはずです。 –

7

いいえいいえ、クラスのコンストラクタは、そのクラスの型だけを返すことができます。あなたは、代わりに(工場出荷時のパターン)の静的作成機能を持つことができます:

Link myLink = Link.Create("10.0.0.1"); 

例えば

public static Link Create(string something) 
{ 
    if (//determine that "something" is an IP address)) 
     return new LinkUdp(something); 
    else 
     return new LinkSerial(something); 

}