我有一个类Number,它假设代表一个分数并实现一个接口Calculation,然后是类Matrix,它假设扩展Class Number并代表一个矩阵,这里是代码:
public interface Calculation {
public int numberAddition();
public int numberSubtraction();
}
public class Number implements Calculation {
private int numerator;
private int denominator;
public Number(int n, int d) {
numerator = n;
denominator = d;
}
public Number() {
this(0, 1);
}
public Number(int n) {
numerator = n;
denominator = 1;
}
public void setNumerator(int n) {
numerator = n;
}
public void setDenominator(int d) {
denominator = d;
}
public int getNumerator() {
return numerator;
}
public int getDenominator() {
return denominator;
}
public String toString() {
String s = getNumerator() + "/" + getDenominator();
return s;
}
public void setNumber(int n) {
numerator = n;
denominator = n;
}
public boolean equals(boolean b) {
Object o1 = new Object();
Object o2 = o1;
if (o1 == o2) return true;
else return false;
}
public int numberAddition(int x, int y) {
return x + y;
}
public int numberSubtraction(int x, int y) {
return x + y;
}
}
public class Matrix extends Number {
private HashMap < Integer, ArrayList < Number >> hm;
private static int rows;
private static int cols;
public Matrix(int r, int c) {
hm = new HashMap < Integer, ArrayList < Number >> ();
rows = r;
cols = c;
}
public void fillMatrix() {
}
}
现在问题:
Number implement Calculation
时,它说“数字必须是抽象的”,当我把它抽象化时,它会说“矩阵不能扩展数字”。fillMatrix
方法填充矩阵,如何填充ArrayList
和HashMap
?答案 0 :(得分:1)
您有一些设计和OOP问题:
Number
是一个分数; Matrix
由 Numbers
组成,它不是Number
。那么它不应该extends
。
当一个类实现一个接口时,它意味着它将实现一些容量或具有接口所描述的一些行为。在代码中,接口中声明的方法的签名必须与实现它的类中定义的签名相匹配。
在您的情况下,界面Calculation
声明
public int numberAddition();
public int numberSubtraction();
没有任何参数。由于您在课程Number
中定义了
public int numberAddition(int x, int y) {...}
public int numberSubtraction(int x, int y) {...}
编译器要求您声明类abstract
。对他来说,你没有履行Calculation
的合同。
A - 可能是 - 更好的界面
public interface Calculation {
Number add(Number n);
Number substract(Number n);
}
然后,对于Matrix
,只需删除extends Number
。在实现方面,最简单的方法是使用普通的java数组或List/ArrayList
public class Matrix {
private Number[][] hm;
public Matrix(int r, int c)
{
hm = new Number[r][c];
}
// fill the matrix with Number n
public void fillMatrix(Number n)
{
for (int r = 0; r < hm.length; r++) {
for (int c = 0; c < hm[r].length; c++) {
hm[r][c] = n;
}
}
}
}
注意:在上面的实现中,所有矩阵元素都将引用Number
的相同实例。如果 Number
是不可变的(即没有setter),那么可能会很好。如果要在适当的位置修改矩阵元素,则应该使用每个元素的新实例初始化矩阵。
答案 1 :(得分:0)
如果Number
实施Calculation
,则必须声明所需的方法 - numberAddition
和numberSubtraction
。它可以通过两种方式实现:通过使用实现(正文)声明它们,或者通过声明它们abstract
。如果Number
的任何方法被声明为abstract
,则该类也必须为abstract
。
由于Matrix
中的错误,我怀疑Number
无法编译。但是,一旦修复了这些,您应该编译正确(如果Number
不是abstract
)或者说Matrix
需要实现从{{继承的abstract
方法的错误1}},或者也声明它们Number
。
答案 2 :(得分:0)
扩展Calculation
时,您需要提供实施numberAddition()
和numberSubtraction()
(不含参数)。如果你不这样做,你将会强制使该类抽象,但任何扩展Number
的非抽象类都将被强制执行。
你想在这做什么?用你的矩阵ArrayList和HashMat填充什么?这将取决于你想要做的事情。
此外,我不明白为什么Matrix
必须延长Number
。从概念上讲,矩阵不是数字,而是数字的排列。所以继承关系可能不是你想要的。请记住,继承可以粗略地转换为&#34; IS&#34;。 Person
是LivingThing
答案 3 :(得分:0)
1)当我使用类号实现计算时,它表示必须编号 是抽象的,
这是因为你提示在intrerface中描述public int numberAddition();
的主体而不是你创建一个新方法numberAddition(int x, int y)
(注意这两个方法不相同),你也不能将Number
作为抽象这是实现界面的必要条件。所以错误就会被抛出。
数字不是抽象的,并且不会覆盖计算中的抽象方法numberSubtraction()
当我把它抽象化时,它会说&#34; Matrix无法扩展数字&#34;。
因为你再次提到在Matrix类中提供接口方法的实现,因为Matrix
扩展了实现接口的抽象类Number
。
答案 4 :(得分:0)
在Number
@Override
public int numberAddition() {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public int numberSubtraction() {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
如何添加到HashMap
int key = 0;
ArrayList<Number> list = new ArrayList();
hm.put(key, list);
正如另一位用户所说,您的类层次结构存在一些问题。您需要另一个扩展Number
的类,以便将其添加到Matix
HashMap
。