2012-06-09 89 views
0

我想将一个类扩展为多个其他类,例如在Java中扩展类

public class Ability extends Character 

由于这个我在我的代码得到一个错误:

隐超构造字符()是不确定的。必须明确地调用另一个构造Defense.java

我的代码是:

public class Character { 
    int characterID; 
    double characterHealth; 

    public Character(int charID, double charHealth) { 
     characterID = charID; 
     characterHealth = charHealth; 
    } 
} 

public class Defense extends Character { 
    int armorClass; 
    int difficultyClass; 

    public Defense(int newAC, int newDC){ 
     armorClass = newAC; 
     difficultyClass = newDC; 
    } 
} 

我不确定如何调用另一个构造。 如果有人能指出为什么以及如何去做。

回答

1

从子类的构造函数:

super(charId, charHealth); 

由于超类没有默认构造函数,因此必须显式调用非缺省构造函数。

+0

嗯,看看我会尝试使用程序可以执行的自动生成的程序部分来做这件事。我给它一个去感谢。 什么是扩展关键字与:在C#中的比较?因为如果我记得:不需要使用超级方法,或者是:与扩展不一样? –

+0

@VasaSerafin构造语义是不同的,因为只要定义一个没有参数的ctor,就不会自动为您生成* implicit * default(no-arg)。只要超类中没有默认的ctor,你就必须明确地调用其中一个 - 这就是Java的方式。 –

+0

所以基本上你说的是超级是在C#中创建的,也只是在程序的后端?有没有一个混乱的方式来定义超级,因为目前,由于所有使用的变量,编码可能会变得很长。 也只是为了澄清,如果我要序列化Character对象,序列化是否会包含其他类? –

1

我不知道,你会得到的值charIdcharHealth,也许这些是常数,但这里是你怎么做:

public Defense(int newAC, int newDC) 
{ 
    super(charId, charHealth); 
    armorClass = newAC; 
    difficultyClass = newDC; 
} 
+0

*“我不知道你会得到值......” - 可能是通过向子类构造函数添加参数。但是,是的,他有一个设计问题那里... –

+0

嗯看到我会尝试使用该程序可以做的自动生成的程序部分。我给它一个去感谢。 –