本文介紹了我可以通過使用一個超類擴展到另一個超類來創建繼承的層次結構嗎?的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
所以我們正在做一個虛擬寵物項目,我們需要創建ArrayList并與虛擬寵物交互。
我想做的是擁有一個可擴展到CatClass和DogClass的PetClass超類。
CatClass將是OrganicCat和RoboticCat的超類。狗類也是如此。
這可能嗎?或者我應該使用抽象方法還是繼承方法?
我找不到任何問題或答案,因此假定這是不可能的。
推薦答案
您可以想出這樣的東西
然而,有一個更好的解決方案。您可以在這里看到這個設計由7個類和一個接口組成。在該圖中,Cat
和Dog
可以(也可能應該)是一個抽象類。這種設計的缺點是類爆炸。假設您需要添加一個WildDog
。首先,您需要創建另一個類。類之間可能有很多公共代碼,因為這些類中的一些可能會執行您不能放在父類上的類似事情。
最佳解決方案是創建基本類,這些基本類可以通過注入您希望特定實例具有的行為來輕松修改。例如,要創建一只有機貓和一只機器貓,您只需創建一個Cat
并向實例注入所需的行為,以便它采用注入的行為。
從表面上看,這看起來并沒有多大改進,因為類的數量只減少了一個。但是,如果再添加一個行為(即WildAnimalBehavior
),就不必創建兩個動物類了。此外,如果您再添加5個動物,您可以想象這個類層次結構將變得多么復雜。此設計的主要思想是將行為添加到對象,而不是僅僅為了對某些行為建模而創建類。事實上,此設計可以允許創建具有某些混合行為的對象。例如,您無需創建CyborgCat
類,而只需將機器人和有機行為注入Cat
實例(通過新的CyborgBehavior
類)。
public abstract class Animal {
protected abstract void makeNoise();
protected abstract void eat();
}
public class Cat extends Animal {
private Behavior behavior;
public Cat(Behavior behavior) {
this.behavior = behavior;
}
@Override
public void makeNoise () {
behavior.makeNoise();
}
@Override
public void eat () {
behavior.eat();
}
}
public interface Behavior {
void makeNoise();
void eat();
}
public class OrganicBehavior implements Behavior {
@Override
public void makeNoise () {
System.out.println(this.getClass().getSimpleName() + ": I am an organic being. I make a natural sound!");
}
@Override
public void eat () {
System.out.println(this.getClass().getSimpleName() + ": Thank you! I require nourishment to live.");
}
}
public class RoboticBehavior implements Behavior {
@Override
public void makeNoise () {
System.out.println(this.getClass().getSimpleName() + ": beep beep... dit dot beep..");
}
@Override
public void eat () {
System.out.println(this.getClass().getSimpleName() + ": I do not require food.");
}
}
public class DependencyInjectionDemo {
public static void main (String[] args) {
Cat roboticCat = new Cat(new RoboticBehavior());
Cat organicCat = new Cat(new OrganicBehavior());
roboticCat.makeNoise();
roboticCat.eat();
organicCat.makeNoise();
organicCat.eat();
}
}
輸出:
RoboticBehavior: beep beep... dit dot beep..
RoboticBehavior: I do not require food.
OrganicBehavior: I am an organic being. I make a natural sound!
OrganicBehavior: Thank you! I require nourishment to live.
雖然我使用了這個示例(基于您的原始模型),但使用DI的更好方法是為每個方法或方法系列創建行為(方法是對象的行為)。例如,EatingBehavior
、NoiseBehavior
等。這樣,您可以更好地混合和匹配行為。例如,可以創建Cat
的兩個實例來顯示機器人行為。然而,也許有一個更先進的例子,它能夠發出有機貓的噪音,而不是基本的機器人噪音,而且仍然不像其他機器貓那樣需要食物。分離該問題中的行為將允許您對代碼進行此類調整,而無需創建另一個類來顯示此類混合行為。
我希望您會發現這個示例很有用。順便說一句,這就是戰略模式。您應該在Web上搜索該主題以及依賴項注入以了解更多信息。在現實世界的應用程序中,我想像《頂點傳奇》、《天際迷航》和《使命召喚》等游戲都會使用這種設計模式,將皮膚應用到基本角色上。在Skyrim中,當創建角色時,角色包含一些基本屬性。當您正在創建角色或設計角色時,屬性會隨著您為角色選擇(注入)新屬性(如膚色、疤痕、嘴型等)而改變。當您選擇皮膚時,其他游戲也是如此。
這篇關于我可以通過使用一個超類擴展到另一個超類來創建繼承的層次結構嗎?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,