繁体   English   中英

从抽象父类扩展时出错

[英]Error when extending from abstract parent class

错误

public Cat (String nm, int legs, String sd, String col)

对于这个构造函数,我得到了以下编译器错误:

constructor Animal in class Animal cannot be applied to given types;
required: String, int
found: no arguments
reason: actual and formal arguments lists differ in length

代码

父类就在子类的下方。

public class Cat extends Animal {
    
    private String sound;
    private String colour;
    
    public Cat (String nm, int legs, String sd, String col) {
        
        nm = super.getName();
        legs = super.getNumOfLegs();
        sound = sd;
        colour = col;
    }
    
    public abstract class Animal {
    
        protected String name;
        protected int numOfLegs;
        
        public Animal() {    
        }

        public Animal(String nm, int legs) {
            name = nm;
            numOfLegs = legs;      
        }

        public String getName() {
            return name;
        }

        public int getNumOfLegs() {
            return numOfLegs;
        }
    
        public abstract String display();
    }
}

父抽象类应该放在一个单独的文件中吗?

我最初尝试过,但它返回的错误比现在多得多,尤其是来自抽象方法display()的错误。

是什么导致了错误?

有几件事你应该改变。

首先,把超类放到一个单独的文件中是最好的方法。 如果你想保留在一个文件中,你需要将它拖出 Cat 类并删除范围(不是公共或私有的)。 但这对于超类来说不是一个好的编码风格。

接下来是名称/nm 和 legs/numOfLegs。 要么调用超级构造函数并提供两个变量(参见我的示例),要么使用 name = nm; 和 numOfLegs = 腿;

您还应该重新考虑 name 和 numOfLegs 变量是否需要保护,或者是否可以仅通过 getter 提供访问权限。

如果腿的数量、名称、声音和颜色不会改变,您也可以使它们不可变(使用关键字 final,例如 private final String sound)。 如果没有,您可以使用 setter 访问它们。

最后你需要在 Cat 类中实现抽象方法......

public class Cat extends Animal {

    private String sound;
    private String colour;

    public Cat(String nm, int legs, String sd, String col) {
        super(nm, legs);
        sound = sd;
        colour = col;
    }

    @Override
    public String display() {
        return null;
    }
}

abstract class Animal {

    protected String name;
    protected int numOfLegs;

    public Animal(String nm, int legs) {
        name = nm;
        numOfLegs = legs;
    }

    public String getName() {
        return name;
    }

    public int getNumOfLegs() {
        return numOfLegs;
    }

    public abstract String display();
    
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM