【问题标题】:Do I need type checking for a C# object factory to call the appropriate methods?我是否需要对 C# 对象工厂进行类型检查才能调用适当的方法?
【发布时间】:2013-04-30 01:56:48
【问题描述】:

给定以下伪 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”转换为“BigMessage”

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

使用.NET 4.5。

提前致谢!

【问题讨论】:

    标签: c# inheritance factory typechecking


    【解决方案1】:

    您收到转换错误的原因是您无法将“消息”类型转换为具体的“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();
      }
    

    }

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-23
      • 2014-06-03
      • 2017-02-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多