Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何创建我可以使用的两个类和标记方法的接口?_Java_Interface_Extends_Implements - Fatal编程技术网

Java 如何创建我可以使用的两个类和标记方法的接口?

Java 如何创建我可以使用的两个类和标记方法的接口?,java,interface,extends,implements,Java,Interface,Extends,Implements,我需要类武器,它将使用步枪中的shoot()方法和散弹枪中的reload()方法 我如何使用接口来实现这一点? 想象一下,我不能修改步枪和猎枪 我的错误认识是 class Rifle { void shoot() { System.out.println("rifle shoot"); } void reload() { System.out.println("rifle reload"); } void onlyRif

我需要类武器,它将使用步枪中的shoot()方法和散弹枪中的reload()方法 我如何使用接口来实现这一点? 想象一下,我不能修改步枪和猎枪

我的错误认识是

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!");
    }
}

这是我想要的工作,但是我怎样才能更简单地使用接口呢?

武器
应该是一个接口:

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

WeaponType weaponType;

    public Weapon(WeaponType weaponType) {

        this.weaponType = weaponType;
    }

    public void shoot() {

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

        this.weaponType.reload();
    }
}
然后在具体实例中,实现该接口:

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

WeaponType weaponType;

    public Weapon(WeaponType weaponType) {

        this.weaponType = weaponType;
    }

    public void shoot() {

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

        this.weaponType.reload();
    }
}

然后,假设你有
r
,这是
Rifle
的一个实例,你可以将
r
添加到
武器的集合中。你不太可能只需要MyRifle
步枪
-具体的东西只需要在构造时传递。

一种方法是定义接口武器,并有两个新类,让我们称它们为MyRifle,它扩展了步枪并实现了武器,而MySHotgun则扩展了霰弹枪并实现了武器

要求您扩展现有类,因为您提到无法修改现有类

所以


尝试使用相同的组合,并使用如下界面:

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

你有一个超级武器,需要一个武器类型。WeaponType是一个具有射击和重新装载方法的界面

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();
     }
}
您的界面:

interface Weapon
{
     void shoot();
     void reload();
}
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!");
    }
}

如果你不能更改
Rifle
和Shotgun`,我看不出接口对你有什么帮助,因为你不能更改这些类来实现接口。你说你不能修改这些类,你还能在它们里面写这么多吗。。工具武器创建武器对象需要什么?或者你可以创建任何对象?就目前而言,这将无限期地递归。当您在
Rifle
的实例上调用
.onlyRifle()
时,它将在它存储的实例
myRifle
上调用它,这将在它存储的实例上调用它,等等。拆下功能体。原则仍然有效。是的,原则是正确的,这就是为什么我没有投反对票:)