2014-12-03 1 views
0
class Rifle { 
    void shoot() { 
     System.out.println("rifle shoot"); 
    } 

    void reload() { 
     System.out.println("rifle reload"); 
    } 

    void onlyRifle() { 
     System.out.println("rifle!"); 
    } 
} 

class Shotgun { 

    void shoot() { 
     System.out.println("shotgun shoot"); 
    } 

    void reload() { 
     System.out.println("shotgun reload"); 
    } 

    void onlyShotgun() { 
     System.out.println("shotgun!"); 
    } 
} 

Мне нужен класс Оружие, которое будет использовать метод стрельбы() из винтовки и метод перезагрузки() из дробовика Как это сделать с помощью интерфейса? Представьте себе, что Я НЕ МОГУ ИЗМЕНИТЬ класс Винтовки и класс РужьеКак создать интерфейс для двух методов класса и меток, которые я могу использовать?

Моей плохая реализация

class Weapon { 
    Rifle myRifle; 
    Shotgun myShotgun; 

    Weapon() { 
     myRifle = new Rifle(); 
     myShotgun = new Shotgun(); 
    } 

    void shoot() { 
     myRifle.shoot(); 
    } 

    void reload() { 
     myShotgun.reload(); 
    } 

    void onlyShotgun() { 
     myShotgun.onlyShotgun(); 
    } 

    void onlyRifle() { 
     myRifle.onlyRifle(); 
    } 
} 

...main(){ 
    Weapon myWeapon = new Weapon(); 
    myWeapon.shoot(); 
    myWeapon.reload(); 
    myWeapon.onlyRifle(); 
    myWeapon.onlyShotgun(); 
} 

Это работа, что я хочу, но как я могу это сделать более просто с помощью интерфейсов?

+0

Если вы не можете изменить 'Rifle' и Shotgun', Я не вижу, как интерфейс вам поможет, поскольку вы не можете изменить эти классы для реализации интерфейса. – Eran

+0

Как вы говорите, вы не можете модифицировать классы, можете ли вы все еще много писать в них - .. орудия оружия – rajesh

+0

требуется создать объект оружия? или вы можете создать любой объект? – Secondo

ответ

1

Weapon должен быть интерфейс:

interface Weapon 
{ 
    void shoot(); 
    void reload(); 
} 

Тогда в ваших конкретных случаях, вы реализовать что интерфейс:

class Rifle implements Weapon 
{ 
    /*ToDo - implement shoot and reload*/ 

    void onlyRifle() { 
     /*ToDo - specific code here*/ 
    } 
} 

Тогда, скажем, если у вас есть r что экземпляр Rifle, вы можете добавить r t o коллекция Weapon. Вряд ли вам когда-нибудь понадобится onlyRifle: Rifle -специальный материал нужно будет передать только на строительство.

+0

Это, в его нынешнем виде, будет длиться бесконечно. Когда вы вызываете '.onlyRifle()' в экземпляре 'Rifle', он будет вызывать его в экземпляре' myRifle', который он хранит, и который будет вызывать его в экземпляре, который он хранит, и т. Д. –

+0

К сожалению. Удалено тело функции. Принцип все еще сохраняется. – Bathsheba

+0

Да, принцип прав, вот почему я не спустил вниз :) –

0

Один из способов иметь оружие интерфейса определены и имеют 2 новых классов, позволяет называть их MyRifle, который расширяет Винтовка и реализует оружие и MySHotgun, который расширяет дробовик и реализует ОРУЖИЕ

Просим вас расширить существующий класс, так как вам Отметим, что вы не можете изменить существующие

так

interface Weapon 
{ 
    void shoot(); 
    void reload(); 
} 

И

class MyRifle extends Rifle implements Weapon{ 
// actual implementations of your methods 
} 
1

Попробуйте так же, как вы использовали композицию и с помощью интерфейса, как:

interface Weapon { 
void shoot(); 
void reload(); 
} 

class ModifiedRifle implements Weapon { 
    Rifle myRifle; 
    Shotgun myShotgun; 
    public ModifiedRifle (Rifle rifle, Shotgun shotgun) { 
      this.myRifle = rifle(); 
      this.myShotgun = shotgun; 
    } 

    public void shoot() { 
     myRifle.shoot(); 
    } 

    public void reload() { 
     myShotgun.reload(); 
    } 
} 
0

У вас есть супер класс оружия, который принимает WeaponType. Your WeaponType - это интерфейс, который имеет методы съемки и перезагрузки.

public class Weapon { 

WeaponType weaponType; 

    public Weapon(WeaponType weaponType) { 

     this.weaponType = weaponType; 
    } 

    public void shoot() { 

     this.weaponType.shoot(); 
    } 
    public void reload() { 

     this.weaponType.reload(); 
    } 
} 

Ваш интерфейс:

public interface WeaponType { 

    public void shoot(); 
    public void reload(); 
} 

Ваш дробовик класс:

public class Shotgun implements WeaponType { 

    @Override 
    public void shoot() { 

     System.out.println("Shotgun shoot!"); 
    } 

    @Override 
    public void reload() { 

     System.out.println("Shotgun reload!"); 
    } 
} 

Пример использования:

Weapon myShotgun = new Weapon(new Shotgun()); 
myShotgun.shoot(); 
myShotgun.reload(); 
Смежные вопросы