有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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";
    }
}

共 (2) 个答案

  1. # 1 楼答案

    不能实例化抽象类。一个更聪明的方法是为Char一个Weapon实例提供构造函数作为参数——您只需在Char中使用它即可

    abstract class Char{
        protected String name;
        public Weapon weapon;
    
        Char(Weapon weapon){
            this.weapon = weapon;
        }
    
        public void fight(){
            weapon.useWeapon(name);
        }
    }
    
    class Troll extends Char{
        Troll(Weapon weapon){
            super(weapon);
            name = "Troll";
        }
    }
    

    稍后在代码中:

    Char troll = new Troll (new Club());
    
  2. # 2 楼答案

    在Java中,抽象类可以有一个或多个指定但未实现的方法。它们被用作共享大多数功能的子类的“最高公分母”,只有少数方法除外。因此,Java禁止创建抽象类的实例,并要求任何子类提供抽象方法的实现。这是故意的。它背后的基本思想是促进代码的可重用性,但在现实生活中,这是一个权衡的组合,所以你的里程可能会有所不同。大多数情况下,通过非抽象基类和接口的组合,可以实现类似的效果

    根据您的示例,Char不必是一个抽象类,但武器是一个很好的候选,因为它有一个“UseArmour”方法。您可以在武器中声明“UseArmour”为抽象,并在剑和棍棒中提供不同的实现。或者,你可以把武器变成一个界面。你想在这里做的抽象是,一个角色可以使用武器,而不知道真正的武器是棍棒还是剑。这意味着你可以在任何时候给一个角色任何类型的武器,一切都应该有效。与其在构造函数中传递字符和“int”,实际上最好是将其传递给武器本身