我有一個類動物。創造性設計模式
類馬和類魚繼承自動物。
我想在列表框GUI中向用戶顯示動物圖像(魚和馬),他應該選擇並按OK以創建魚或馬。
(該列表框中的圖像應創建是動態的(例如正從XML圖像)。)
這不是一個GUI的問題:)
你認爲的優先停留設計模式是什麼那?
我以爲用屬性圖像和AnimalTypeEnum創建類AnimalInfo。這將是我選擇的。
但是,如何將它連接到我之後創建的動物。動物類擁有什麼?
謝謝。
我有一個類動物。創造性設計模式
類馬和類魚繼承自動物。
我想在列表框GUI中向用戶顯示動物圖像(魚和馬),他應該選擇並按OK以創建魚或馬。
(該列表框中的圖像應創建是動態的(例如正從XML圖像)。)
這不是一個GUI的問題:)
你認爲的優先停留設計模式是什麼那?
我以爲用屬性圖像和AnimalTypeEnum創建類AnimalInfo。這將是我選擇的。
但是,如何將它連接到我之後創建的動物。動物類擁有什麼?
謝謝。
AnimalInfo接口還應該包含返回一個動物,就像一個工廠方法:
Animal createAnimal();
然後調用,當用戶點擊和你有一個動物。它也可以抽象構造函數所需的參數。例如,如果Fish構造函數使用顏色,而Horse不使用,則可以對其進行硬編碼或將其作爲Fish的AnimalInfo實現的標記。
我會推薦一個工廠模式。看看this source。但是,我認爲你可能不一定需要一個模式。您顯然正在使用面向對象的語言。我建議你讓Animal成爲一個抽象類,並添加一個方法來創建或獲取圖像。然後在每個子類中實現圖像。在你的代碼中,只需調用任何動物的方法,並調用正確的方法,創建你的圖像。
更新:
我想在我剛纔的答覆擴大。我認爲你應該簡單地使用多態。這個詞逃脫了我,但這是我一直在想的。 This post給出了一些很好的例子,說明如何使用多態性進行你想做的事情。以下是我建議:
public class Animal
{
String name;
Bitmap image;
abstract Bitmap getImage();
}
public class Cat extends Animal
{
public Cat(string name, Bitmap image)
{
this.name = name;
this.image = image;
}
public Bitmap getImage()
{
return image;
}
}
public class Dog extends Animal
{
public Dog(string name, Bitmap image)
{
this.name = name;
this.image = image;
}
public Bitmap getImage()
{
return image;
}
}
現在,你可以做到以下幾點:
Animal myAnimal = new Cat("Susi", prettyPicture);
showImage(myAnimal.getImage());
其中showImage()
是可視化圖像的方法。現在,這個例子看起來很愚蠢,因爲你可以在不使用多態性的情況下直接完成它,而只是按照你的建議存儲一個類型。但想象一下,你想要照片被區別對待。在獲取圖片的每種方法中,您都可以實現不同的行爲。就你所知,一個類不能直接存儲位圖,而是存儲資源的URI。所有對你的GUI都是透明的,因爲它期望一個位圖返回到方法調用。這個原則被稱爲封裝,是OO設計的另一個基石。此外,如果你看過這些例子,你可以想象通過一個簡單的playSound()
方法在GUI上爲每隻動物播放聲音,該方法在Animal
中再次抽象出來,並由具體的子類實現。
我希望你找到你正在尋找的答案!
非常感謝您的詳細信息。看起來這是我的解決方案。 – user1902346
很高興你發現你在找什麼。根據您的權限,如果回答您的問題,請點擊分數下方的複選標記接受答案。 – Eric
您可以使用簡單工廠模式,下面的示例代碼清單:
public interface IAnimial
{
void DrawImage();
}
public class Animial:IAnimial
{
public void DrawImage()
{
Console.WriteLine("Image for Animial");
}
}
public class Hourse:IAnimial
{
public void DrawImage()
{
Console.WriteLine("Image for Hourse");
}
}
public class Fish : IAnimial
{
public void DrawImage()
{
Console.WriteLine("Image for Fish");
}
}
public class CreateAnimial
{
public static IAnimial Factory(string animialType)
{
switch (animialType)
{
case "Hourse":
return new Hourse();
case "Fish":
return new Fish();
default:
return new Animial();
}
}
}
static void Main(string[] args)
{
IAnimial animial = CreateAnimial.Factory("Hourse");
animial.DrawImage();
}
請接受的解決方案是否能解決你的問題。 – Eric