java初始化抽象类的一般变量
我有两个抽象类:Char和武器。每个都有两个衍生类:国王和巨魔,以及俱乐部和剑
角色始终有武器,但未指定类型。因此,在构建Char类时,我无法初始化正确的类型。此外,在选择字符时,我同样无法初始化正确的类型
Is it wrong to initialise an abstract class? How can one initialise a class of one sort and then change the variable class? Provided the new type is a trivially different inheritation of the same parent class? Or should one go about it completely differently?
很可能我还没有理解抽象类的概念。我不熟悉Java和纯OOP
public class Player{
private Char c; // Wrong?
public void changeChar(int charID, int wepID){
switch(charID){
case 1: c = new King(wepID); break;
case 2: c = new Troll(wepID); break;
}
}
public void fight(){
c.fight();
}
}
abstract class Char{
protected String name;
public Weapon weapon; // Wrong?
Char(int wepID){
switch(wepID){
case 1: weapon = new Sword(); break;
case 2: weapon = new Club(); break;
}
}
public void fight(){
weapon.useWeapon(name);
}
}
abstract class Weapon{
protected String wepName;
public void useWeapon(String user){
System.out.println(user + " fights with " + wepName);
}
}
class Club extends Weapon{
Club(){
wepName = "Club";
}
}
class Sword extends Weapon{
Sword(){
wepName = "Sword";
}
}
class Troll extends Char{
Troll(int wepID){
super(wepID);
name = "Troll";
}
}
class King extends Char{
King(int wepID){
super(wepID);
name = "King";
}
}
# 1 楼答案
不能实例化抽象类。一个更聪明的方法是为
Char
一个Weapon
实例提供构造函数作为参数——您只需在Char
中使用它即可稍后在代码中:
# 2 楼答案
在Java中,抽象类可以有一个或多个指定但未实现的方法。它们被用作共享大多数功能的子类的“最高公分母”,只有少数方法除外。因此,Java禁止创建抽象类的实例,并要求任何子类提供抽象方法的实现。这是故意的。它背后的基本思想是促进代码的可重用性,但在现实生活中,这是一个权衡的组合,所以你的里程可能会有所不同。大多数情况下,通过非抽象基类和接口的组合,可以实现类似的效果
根据您的示例,Char不必是一个抽象类,但武器是一个很好的候选,因为它有一个“UseArmour”方法。您可以在武器中声明“UseArmour”为抽象,并在剑和棍棒中提供不同的实现。或者,你可以把武器变成一个界面。你想在这里做的抽象是,一个角色可以使用武器,而不知道真正的武器是棍棒还是剑。这意味着你可以在任何时候给一个角色任何类型的武器,一切都应该有效。与其在构造函数中传递字符和“int”,实际上最好是将其传递给武器本身