簡體   English   中英

我是否需要對C#對象工廠進行類型檢查以調用適當的方法?

[英]Do I need type checking for a C# object factory to call the appropriate methods?

給出以下偽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'

最終,我希望Factory能夠為我提供一個繼承自Message的對象,這是我提前不知道的類型。 考慮到返回的不同類型,我需要采取不同的行動。 在這種情況下,繼承非常有用,因為抽象類提供了與其子類共享的許多有用功能。

使用.NET 4.5。

提前致謝!

您收到轉換錯誤的原因是您無法將“消息”類型轉換為具體的“BigMessage”或“SmallMessage”。 它應該是你理解(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();
  }

}

希望這可以幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM