4

ToString()メッセージデータを表す(メソッドを実装する)いくつかの異なるクラスがあります

  • DatabaseMessage
  • Method1Message
  • Method2Message
  • 等...

次にMessage、送信者を表す文字列と、(メッセージからの) about メッセージ データ クラスの 1 つを表す文字列を持つクラスがありToString()ます。このクラスを作成して、通信パイプにメッセージを送信します。

もう一方の端ではMessage、文字列からクラスを作成し、それがどのメッセージ データ型であるかを正確に認識している特定のメソッドに送信します。DatabaseMessage次に、メッセージ オブジェクト全体を何かにキャストして、特定のメッセージ データ (クラスなど)にアクセスできるようにします。

class DatabaseMessage
{
    public string ToString()
    {
        // ...
    }
}

class Message
{
    public string sender;
    public string data;

    public static Message FromString(string message)
    {
        // ...
    }
}

//...

public void Send()
{
    DatabaseMessage db_mess = new DatabaseMessage();

    Message m = new Message();
    m.sender = "me";
    m.data = db_mess.ToString();
}

public void Recieve(string message)
{
    Message m = Message.FromString(message);

    DatabaseMethod(m);
}

public void DatabaseMethod(Message m)
{
    // I want to be able to do this:
    DatabaseMessage db_mess = (DatabaseMessage)m;

    //...
}

これを実装するにはどうすればよいでしょうか。

それが理にかなっていることを願っています。

4

4 に答える 4

0

わかりました、これについてどう思うか見てください。

述べられているようにあなたの問題はあなたがこれを行うことができないということです:

DatabaseMessage db_mess = (DatabaseMessage)m;

...でmはないのでDatabaseMessageMessageです。しかし、私が理解しているようにm.data、「シリアル化された」を表す文字列なので、他のタイプでパターンDatabaseMessageを継続してこれを行うことができますか?MessageType.FromString()Message

DatabaseMessage db_mess = DatabaseMessage.FromString(m.data);

問題が、どの種類のMessageタイプが含まれているのかをどのように判断するかということである場合はm.data、私に知らせてください。

于 2012-12-31T13:27:41.057 に答える
0

クラス インスタンスの typeof をチェックすると、新しいメッセージ タイプが導入されるたびにメソッド コードを変更する必要があり、Open/Close Principleに違反します。

オブジェクト インスタンス (XmlSerializer または DatacontractSerializer) のシリアル化をトランスポート メカニズムとして使用し、ポリモーフィズムを使用してメッセージに対して操作を実行する別の方法を提案します。このように、新しいメッセージ タイプを含めると、新しいクラスが導入され、仮想メソッドがオーバーライドされるため、Open Close Principle に違反することはありません。

ここに画像の説明を入力

したがって、シリアライズを Xml に送信し、トランスポートしてデシリアライズし、デシリアライズされたオブジェクトで peformWorkOnMessage() メソッドを呼び出します。

それはうまくいくでしょうか?

于 2012-12-31T13:03:52.840 に答える
0

私はあなたのデザインには触れません。なぜこれを行う必要があるのですか。

暗黙的または明示的に型を変換するには、変換演算子のオーバーロードと呼ばれる何かを行う必要があります。

これらの演算子をオーバーライドすることで、さまざまなタイプの変数を割り当てることができ、変換のために適切なメソッドが呼び出されます。(もちろん、実装するオーバーロードされたメソッドによって変換タイプがサポートされている場合)。

    public static explicit operator DatabaseMessage (Message m)  
    {
        DatabaseMessage dm = new ...
        // conversion stuff

        return dm; // return the new DatabaseMessage after conversion
    }

お役に立てれば。オフィール。

于 2012-12-31T12:59:10.980 に答える
0

私が理解していることから、必要なのはインターフェースか、特定のクラスを拡張することです。

Message をインターフェースとして作成する場合、それを実装するものはすべて特定のメソッドを持つ必要があると定義できます。

次に、必要なタイプを取得するには、次のようなものを使用できます。

if (myMessage.GetType() == typeof(DatabaseMessage))
{
DatabaseMessage myDatabaseMessage = (DatabaseMessage)myMessage;

//etc...

}

ただし、インターフェイスを使用したことがある場合は、同じインターフェイスを使用していれば、オブジェクトの種類に関係なくメソッドが機能するため、型を気にする必要さえありません。

于 2012-12-31T12:44:42.730 に答える