代码之家  ›  专栏  ›  技术社区  ›  Felix

初始化抽象类的一般变量

  •  0
  • Felix  · 技术社区  · 7 年前

    武器 . 每个都有两个衍生类别: 拖钓 俱乐部 .

    角色总是有武器,但类型没有指定。因此,在构建 类I无法初始化正确的类型。此外,在选择字符时,我同样无法初始化正确的类型。

    很可能我还没有理解抽象类的概念。我不熟悉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 回复  |  直到 7 年前
        1
  •  2
  •   Assafs    7 年前

    不能实例化抽象类。更明智的方法是为 Char Weapon 实例作为参数-您只需在 烧焦 .

    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
  •   jurez    7 年前

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

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