一个人可以是一个钢琴家,有一个.play()方法,一个歌手,有一个.sing()方法,无论是钢琴家还是歌手,在后一种情况下,他能够.sing()以及.play()
这种情况的可能设计是什么?
答案 0 :(得分:7)
Pianist
和Singer
必须是接口,以及相应的方法。
然后,您可能会为同时为Pianist
和Singer
的特定人员开设课程:
class DoublyTalentedPerson implements Pianist, Singer {
public void play() {...}
public void sing() {...}
}
答案 1 :(得分:4)
听起来像是家庭作业。
我建议您使用encapsulation和功能对象。在这种情况下,让表演者知道如何发挥能力。
你会有这样的事情:
class Performer extends Person {
List<Capability> capabilities;
}
// Perhaps call it 'Skills'
interface Capability {
public void play();
}
class Pianist implements Capability {
public void play() {
// ....
}
}
class Singer implements Capability {
public void play() {
sing();
}
public void sing() {
// ....
}
}
答案 2 :(得分:2)
这样的事情可能就是你想要的......
public interface Peformer {
//...
}
public interface Pianist extends Performer {
void play();
}
public interface Singer extends Performer {
void sing();
}
public class SingerImpl implements Singer {
public void sing() {
// ...
}
}
public class PianistImpl implements Pianist {
public void play() {
// ...
}
}
public class PianistSingerImpl implements Pianist, Singer {
public void play() {
// ...
}
public void sing() {
// ...
}
}
答案 3 :(得分:0)
人可以是非常好的歌手,可以和唱歌一起弹钢琴。但他的主要专业是唱歌。所以在这种情况下,我们可以从Singer派生Person类并实现钢琴界面。这也适用于另一种方式(人是好钢琴演奏者,他通常在弹钢琴时唱这首歌)。通过这种方式,Singer可以演奏多种乐器,如吉他,钢琴,鼓等。
答案 4 :(得分:0)
interface Singer {
void sing();
}
interface Pianist {
void play();
}
class SingerImpl implements Singer {
public void sing() {}
}
class PianistImpl implements Pianist {
public void play() {}
}
class SingerPianist implements Singer, Pianist {
public void sing() {}
public void play() {}
}
一个只是歌手的人来自SingerImpl
。刚刚弹奏钢琴的人来自PianistImpl
,而两人都来自SingerPianist
。