2011-12-21 12 views
2

私は自分のドメインで使用しているIDeviceIdというインターフェースを持っています。 IDeviceIdを実装する具体的なクラスもいくつかあります。各具象クラスには、特定のタイプのロジック(DeviceId)が含まれています。たとえば、DeviceMacIdがあります。これは単に有効なMACアドレスです。もう1つの具体的なクラスはDeviceShortMacIdです。これは有効なMACアドレスの最後の6桁を取り、固定された6文字のプレフィックスと組み合わせて有効なMACを作成します(いくつかのレガシーアプリケーションでは最後の6桁のみを使用します)。私はIDを表現するためのいくつかのクラスを持っていますが、それらの大部分はすべて同じデータの派生物です。オブジェクトを別のオブジェクトに変換するにはどうすればよいですか?

私はこれらのクラスのいずれかから別のクラスに簡単に変換できるようにしたいと思います。私の最初の考えは、静的クラスを作成し、DeviceIdConverter.ToDeviceShortMacId(IDeviceId)のようなことをすることでした。

データを1つのフォームで簡単に受け入れ、繰り返し可能な方法で複数のアプリケーションに渡って別のフォームに簡単に変換できるようにするにはどうすればよいですか?

答えて

3

私はこれを行うには "最良の方法"はないと思うが、あなたのために働くパターンを見つけなければならない。その後、各クラスは、変換メソッドを実装する必要があるでしょう

interface IDeviceId 
{ 
    // Other methods 
    IDeviceId ToDeviceShortMacId(IDeviceId); 
    IDeviceId ToDeviceMacId(IDeviceId); 
    // etc... 
} 

:あなたは私のような何かをするだろう提示例に基づいて私の頭の上オフ

、。今度は多くの他の実装(具体的)クラスを後で追加する予定がある場合、これはかなり冗長になる可能性があります。

public static class MacDeviceIdExtensions 
{ 
public static DeviceMacId ToDeviceMacId(this IDeviceId deviceId) 
{ 
    // Implement conversion 
} 
public static DeviceShortMacId ToDeviceMacId(this IDeviceId deviceId) 
{ 
    // Implement conversion 
} 
} 

拡張メソッドのアプローチは、多くのモジュラーですが、また、より多くの可能性:だから何あなたが、その場合には検討するかもしれないと、新しい実装を作成し、プロジェクトのそれぞれに、あなたはまた、のような拡張メソッドを作成していますコード。

+0

私の究極の解決策はより複雑になりました(そしてドメイン固有のもの)。しかし、このアプローチは私にとって最も効果的でした。これ以外にもこのスレッドにはたくさんの良いオプションがあります。 – GregB

2

IDeviceIDオブジェクトを受け入れるすべてのIDeviceID実装クラスでコンストラクタを作成するだけではどうでしょうか。

DeviceMacID macID = new DeviceMacID(...whatever you do normally...); 
DeviceShortMacID shortMacID = new DeviceShortMacID((IDeviceID)macID); 

例コード

public DeviceShortMacID : IDeviceID 
{ 
    private ID _ID; 
    public DeviceShortMacID() { } 
    public DeviceShortMacID(IDeviceID id) 
    { 
     if (id is DeviceshortMacID) 
      this._ID = id.GetID(); 
     else 
      this._ID = this.ConvertFrom(id); 
    } 

    public ID ConvertFrom(IDeviceID oldID) { ... convert code ...} 
    public ID GetID() { return this_ID; } 
} 

public interface IDeviceID 
{ 
    public ID GetID(); 
    public ID ConvertFrom(IDeviceID oldID); 
} 

public class ID { } // I don't know what you return so I'm making up this class 
+0

私は、具体的なクラスごとにあるクラスから別のクラスに変換するロジックを持つ必要はありませんか?コンバージョンロジックのすべてが1つの場所にある場合(コンクリートクラスを追加する場合は1つのクラスを、コンクリートクラスをすべて更新する必要がある場合は1つのクラスを編集する方が簡単です) – GregB

+0

各クラスに必要な唯一のロジックは、genral IDeviceIDをどのように取得し、独自のIDを作成するかのコードです。あなたがDeviceMacIDかDeviceShortMacIDを渡すかどうかが重要な場合、私はあなたのインターフェースが正しく定義されているとは思わない。 –

3

一つの可能​​性は、独自の鋳造を実装するために、次のようになります。

public static explicit operator DeviceShortMacId(DeviceMacId deviceMacID) 
{ 
    return new DeviceShortMacId(deviceMacID.MacAddress); 
} 

public static explicit operator DeviceMacId(DeviceShortMacId deviceShortMacID) 
{ 
    return new DeviceMacId(deviceShortMacID.MacAddress); 
} 

あなたが行うことができますこの方法:この方法で

DeviceMacId newDeviceId = (DeviceShortMacId)deviceMacID 

、一部のコンバージョンあなた自身でそれを処理し、InvalidCastExceptionを投げることができます。

+0

'as'演算子は暗黙的演算子を使用しません。タイプを変換しません*。 「aはタイプだと思う? (型)a:null'が、明示的にキャストされません。 –

+0

右。それを忘れてしまった。ありがとう。そして、それを明快にするために明示します。このことは暗黙のうちではありません。 – MPelletier

+0

本当に! Upvoted。 –

2

私には昔ながらのものがありますが、ここでは静的メソッドのアプローチのようなものがあります。エンティティから分離された変換ロジックと、各変換が何をするかを説明するわかりやすいメソッド名があります。それらを拡張メソッドとして実装することも考えてください。

+1

昔ながらのものではないという私の心の中で、それは賢い方法です。拡張メソッドを提案するための – MPelletier

+0

upvote;) – Adam

関連する問題