Java OO设计:一个人可以是歌手,钢琴家或两者兼而有之

时间:2012-02-21 19:27:18

标签: java oop multiple-inheritance

一个人可以是一个钢琴家,有一个.play()方法,一个歌手,有一个.sing()方法,无论是钢琴家还是歌手,在后一种情况下,他能够.sing()以及.play()

这种情况的可能设计是什么?

5 个答案:

答案 0 :(得分:7)

PianistSinger必须是接口,以及相应的方法。

然后,您可能会为同时为PianistSinger的特定人员开设课程:

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