有没有办法实现特定铸造的方法?

时间:2012-12-31 12:37:08

标签: c# oop casting

我有几个不同的类来表示消息数据(实现ToString()方法)

  • DatabaseMessage
  • Method1Message
  • Method2Message
  • 等...

然后我有一个Message类,它有一个代表发送者的字符串和一个代表一个消息数据类的字符串(来自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 个答案:

答案 0 :(得分:0)

根据我的理解,你想要的是一个界面,或者扩展一个特定的类。

如果您将Message作为接口创建,则可以定义实现它的任何内容都必须具有特定的方法。

然后为了得到你想要的类型,你可以使用这样的东西:

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

//etc...

}

但是如果您使用了接口,则甚至不需要关心类型,因为无论对象类型如何使用相同的接口,方法都将起作用。

答案 1 :(得分:0)

我不会进入你的设计,为什么你需要这样做。

为了隐式或明确地转换类型,您需要做一些名为Conversion operator overloading的事情。

通过重写这些运算符,您可以只分配不同类型的变量,并且将调用适当的方法进行转换。 (当然,当您要实现的重载方法支持转换类型时)。

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

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

希望这会有所帮助。 奥菲尔。

答案 2 :(得分:0)

检查typeof类实例需要您在每次引入新消息类型时更改方法代码 - 违反Open/Close Principle

我提出了另一种方法,使用对象实例的序列化(XmlSerializer或DatacontractSerializer)作为传输机制,然后使用多态来对消息执行操作。这种方式在包含新消息类型时会引入新类并重写虚方法,因此不会违反Open Close Principle。

enter image description here

所以on serial serialize to Xml,transport和derserialize然后在反序列化的对象上调用peformWorkOnMessage()方法..

那会有用吗?

答案 3 :(得分:0)

好的,看看你对此的看法。

您所说的问题是您不能这样做:

DatabaseMessage db_mess = (DatabaseMessage)m;

...因为m不是DatabaseMessage,所以它是Message。但据我所知,m.data是一个代表“序列化”DatabaseMessage的字符串,您可以继续使用其他MessageType.FromString()类型的Message模式并执行此操作吗?

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

如果问题更多的是如何判断Message中包含哪种m.data类型,请与我们联系。