Java OO design: человек может быть певцом, пианистом или и тем, и другим - PullRequest
1 голос
/ 21 февраля 2012

Человек может быть либо пианистом, у которого есть метод .play (), либо певцом, у которого есть метод .sing (), либо пианистом и певцом, в последнем случае он сможет .sing (), а также .play ()

Каков был бы возможный дизайн для этой ситуации?

Ответы [ 5 ]

7 голосов
/ 21 февраля 2012

Pianist и Singer должны быть интерфейсами с соответствующими методами.

Тогда у вас может быть класс для конкретного человека, который является Pianist и Singer:

class DoublyTalentedPerson implements Pianist, Singer {
  public void play() {...}
  public void sing() {...}
}
4 голосов
/ 21 февраля 2012

Звучит как домашнее задание для меня.

Я бы предложил вам использовать инкапсуляцию и объекты возможностей. В этом случае, сделайте инструменты, которые исполнитель знает, как играть, чтобы быть способностями.

У вас будет что-то вроде этого:

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 голосов
/ 21 февраля 2012

Что-то вроде этого, вероятно, то, что вы ищете ...

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() {
        // ...
    }
}
0 голосов
/ 21 февраля 2012
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.

0 голосов
/ 21 февраля 2012

Человек может быть очень хорошим певцом и может играть на фортепиано вместе с пением.Но его главный профессионал - Пение.Таким образом, в этом случае мы можем извлечь класс Person из Singer и реализовать интерфейс Piano.Это справедливо и в отношении другого (Человек - хороший пианист, и он обычно поет песню, играя на пианино).Таким образом, Singer может играть на нескольких инструментах, таких как гитара, фортепиано, ударные и т. Д.

...