1

给定以下伪 C# 代码:

class BigMessage : Message { }

class SmallMessage : Message { }

abstract class Message
{
    static public Message Factory()
    {
        Random random = new Random();
        int randomNumber = random.Next(0, 100);
        if (randomNumber > 50)
        {
            return new BigMessage();
        }
        else
        {
            return new SmallMessage();
        }
    }
}

class Worker
{
    public void Comprehend(BigMessage bm)
    {
    }
    public void Comprehend(SmallMessage bm)
    {
    }
    public void start() {
        Message msg = Message.Factory();
        Comprehend(msg);
    }
}

如果我要求工厂给我一个从 Message 继承的随机 Message 对象(例如 Big 或 Small Message),并且我希望 Worker 类中的 Comprehend 方法对使用重载给出的消息类型进行操作(正确的 OO 方式,而不是显式类型检查),为什么我会收到以下两种类型的错误,你能帮我理解我做错了什么吗?

  1. 'Worker.Comprehend(BigMessage)' 的最佳重载方法匹配有一些无效参数。
  2. 无法从“消息”转换为“大消息”

最终,我希望工厂为我提供一个继承自 Message 的对象,我事先不知道他的类型。鉴于返回的类型不同,我确实需要采取不同的行动。继承在这种情况下非常有用,因为抽象类提供了许多与其子类共享的有用功能。

使用 .NET 4.5。

提前致谢!

4

1 回答 1

3

您收到转换错误的原因是您无法将“消息”类型转换为具体的“BigMessage”或“SmallMessage”。它应该是您拥有 Comprehend(Message msg) 的另一种方式,它允许该方法接受任何继承的对象。

另外,我认为您要实现的是多态性。我相信要正确创建您的对象,您的基本抽象类 Message 应该有一个名为“Comprehend”的方法,并且在您的工作进程中,您调用 msg.Comprenhend()。这样,当您获得更多额外的消息类型时,您不会为每条消息向您的工作人员类添加额外的理解方法。通过利用 OOP 和继承,您可以让对象决定它们如何理解自己。

下面的示例代码:

abstract class Message
{
  abstract void Comprehend();
  public static Message Factory(){... code here to return message }
}

class BigMessage : Message
{
  public void Comprehend()
  {
    //do work here
  }
}

class SmallMessage : Message
{
  public void Comprehend()
  {
    //do work here
  }

class Worker
{
  public void Start()
  {
    var msg = Message.Factory();
    msg.Comprehend();
  }

}

希望这可以帮助!

于 2013-04-30T02:30:04.197 回答