我是否需要对c#对象工厂进行类型检查以调用适当的方法?

本文关键字:调用 检查 方法 类型 是否 工厂 对象 | 更新日期: 2023-09-27 18:11:21

给定以下伪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);
    }
}

如果我要求工厂给我一个随机的消息对象继承自消息(例如大或小消息),我希望工人类中的领悟方法对使用重载(正确的OO方式,而不是显式的类型检查)给出的消息类型起作用,为什么我得到以下两种类型的错误,你能帮助我理解我做错了什么?

  1. 最佳重载方法匹配' worker . understand (BigMessage)'有一些无效参数。
  2. 无法从'Message'转换为'BigMessage'

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

提前感谢!

我是否需要对c#对象工厂进行类型检查以调用适当的方法?

您得到转换错误的原因是您不能将"Message"类型转换为具体的"BigMessage"或"SmallMessage"。它应该是另一种方式,你有领悟(Message msg),它允许方法接受任何继承的对象。

另外,我认为你想要实现的是多态性。我相信正确地创建你的对象,你的基本抽象类Message应该有一个叫做"领悟"的方法,在你的工作进程中,你调用msg.领悟()。这样,当您获得更多额外的消息类型时,您就不必为每个消息向您的工作者类添加额外的理解方法。通过利用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();
  }

}

希望这对你有帮助!