[英]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方式,而不是顯式類型檢查),為什么我會得到以下兩種類型的錯誤,你能幫我理解我做錯了嗎?
最終,我希望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.