因此,我们有一个项目,我们应该做一个简单的“计算机”,在该计算机中,我们有一个内存,该内存的地址指向不同种类的单词。
public interface Word extends Operable {
Word add(Word word1, Word word2);
Word mul(Word word1, Word word2);
}
然后我们应该能够对这些单词进行操作,其中两个操作是add和mul。然后,可以在各个单词子类中实现Word接口。
public class ByteWord implements Word {
private Byte value;
public ByteWord(String stringValue) {
this.value = Byte.parseByte(stringValue);
}
@java.lang.Override
public ByteWord add(Word word1, Word word2) {
this.value = word1.getValue() + word2.getValue();
return this;
}
@java.lang.Override
public ByteWord mul(Word word1, Word word2) {
this.value = word1.getValue() * word2.getValue();
return this;
}
private Byte getValue() {
return value;
}
}
这里的问题是IntelliJ表示无法解析getValue(),而另一条警告则指出从未使用过getValue()。
将word1和word2的类型更改为ByteWord可以解决此问题,但会出现另一个错误,表明我们实际上并未从Word中添加未实现的方法。
并将它们强制转换为正确的单词类型,在此我们将值分配给this.value,因为我们知道我们将始终发送某种类型,这表示Java期望的字节购买是通过将两个字节加在一起而得到的。 >
在此先感谢您能解决我的问题的任何输入!
答案 0 :(得分:1)
private Byte getValue() {
return value;
}
这是属于ByteWord
类的方法,而不是Word
,因此您不能调用word1.getValue()
。您收到的警告是因为您从未在ByteWord
对象上调用它。
将word1和word2的类型更改为ByteWord可以解决此问题,但会出现另一个错误,表明我们实际上并未从Word中添加未实现的方法。
这是因为您在Word
中将方法定义为接受Word
参数。
答案 1 :(得分:0)
正如其他答案所说,编译器找不到getValue()
方法的原因是因为word1
和word2
是Word
对象,而Word
没有没有getValue()
方法,因此您不能在Word
对象上调用它。该方法是ByteWord
专用的,因此您只能在ByteWord
个对象上专门调用它。
但是... word1
和word2
成为Word
有意义吗?
如果ByteWord
到mul
两个Word
本身不是ByteWord
的话,这是否有意义?
如果我有DWord
类,这样做是否有意义?
DWord dword = new DWord(10);
ByteWord byte1 = new ByteWord(1);
ByteWord byte2 = new ByteWord(2);
dword.add(byte1, byte2);
我不这么认为。 ByteWord
与ByteWord
一起使用,而DWord
与其他DWords
一起使用是否更有意义?
然后,您可能需要做的是使接口通用:
public interface Word<T extends Word> extends Operable {
T add(T word1, T word2);
T mul(T word1, T word2);
}
所以每个类都相应地实现它:
public class ByteWord implements Word<ByteWord> {
private Byte value;
public ByteWord(String stringValue) {
this.value = Byte.parseByte(stringValue);
}
@Override
public ByteWord add(ByteWord word1, ByteWord word2) {
this.value = (byte) (word1.getValue() + word2.getValue());
return this;
}
@Override
public ByteWord mul(ByteWord word1, ByteWord word2) {
this.value = (byte) (word1.getValue() * word2.getValue());
return this;
}
private Byte getValue() {
return value;
}
}
public class DWord implements Word<DWord> {
private Integer value;
public DWord(String stringValue) {
this.value = Integer.parseInt(stringValue);
}
@Override
public DWord add(DWord word1, DWord word2) {
this.value = word1.getValue() + word2.getValue();
return this;
}
@Override
public DWord mul(DWord word1, DWord word2) {
this.value = word1.getValue() * word2.getValue();
return this;
}
private Integer getValue() {
return value;
}
}
现在您可以写:
ByteWord byte1 = new ByteWord("1");
byte1.add(new ByteWord("2"), new ByteWord("3"));
System.out.println("byte1 = " + byte1.value);
并输出:
byte1 = 5
还要写:
byte1.add(new DWord("2"), new DWord("3"));
看到它不能编译,因为DWord
不是ByteWord
。
但这仍然很奇怪,因为如果您永远不会在计算中使用初始value
有什么意义?
因此,也许再说一次,让方法对Word
的当前值进行操作(仅接收一个参数)更有意义:
public interface Word<T extends Word> extends Operable {
T add(T word1);
T mul(T word1);
}
public class ByteWord implements Word<ByteWord> {
private Byte value;
public ByteWord(String stringValue) {
this.value = Byte.parseByte(stringValue);
}
@Override
public ByteWord add(ByteWord word1) {
this.value = (byte) (this.value + word1.getValue());
return this;
}
@Override
public ByteWord mul(ByteWord word1) {
this.value = (byte) (this.value * word1.getValue());
return this;
}
private Byte getValue() {
return value;
}
}
最后,您现在可以编写:
ByteWord byte1 = new ByteWord("1");
byte1.add(new ByteWord("2"));
System.out.println("byte1 = " + byte1.value);
并输出:
byte1 = 3
我认为这更有意义。
但是,我不知道您要在问题中包含的代码是您的还是老师的,也不知道您可以修改哪些部分,不能修改哪些部分,所以我只希望我给您一些内容。洞察力。