Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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_Oop_Interface_Polymorphism - Fatal编程技术网

Java 我如何表达对象,它应该是两个不同的类在同一时间

Java 我如何表达对象,它应该是两个不同的类在同一时间,java,oop,interface,polymorphism,Java,Oop,Interface,Polymorphism,今天,我在OOP中进行了测试,我被分配了以下任务来编写代码: 假设您有两个类:Employee(代表员工)和Ninja(代表忍者)。雇员既有状态又有行为;忍者只有行为。您需要代表一名同时也是忍者的员工(现实世界中的一个常见问题)。通过只创建一个接口和一个类(NinjaEmployee),展示如何做到这一点,而不必从任何一个原始类复制方法实现代码。在main方法中测试代码 我不是很了解这个问题,但这是我带来的解决方案(我知道这不是问的问题): 除了main之外,我创建了4个类。由于员工有状态和行为

今天,我在OOP中进行了测试,我被分配了以下任务来编写代码:

假设您有两个类:Employee(代表员工)和Ninja(代表忍者)。雇员既有状态又有行为;忍者只有行为。您需要代表一名同时也是忍者的员工(现实世界中的一个常见问题)。通过只创建一个接口和一个类(NinjaEmployee),展示如何做到这一点,而不必从任何一个原始类复制方法实现代码。在main方法中测试代码

我不是很了解这个问题,但这是我带来的解决方案(我知道这不是问的问题):

除了main之外,我创建了4个类。由于员工有状态和行为,我提出了以下代码:

public class Employee {
    private int ID;
    private String Name;
    private double salary;

    public Employee(int ID, String Name, double salary) {
        this.ID = ID;
        this.Name = Name;
        this.salary = salary;
    }

    public int getID() {
        return ID;
    }

    public void setID(int ID) {
        this.ID = ID;
    }

    public String getName() {
        return Name;
    }

    public void setName(String Name) {
        this.Name = Name;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    public void startWorking() {
        System.out.println("Started Working");
    }
}
忍者职业只有以下行为:

public class Ninja {

    public Ninja(){}


    public void moveNinja(){
        System.out.println("Ninja moved");
    }
}
雇员类别:

public class NinjaEmployee extends Employee implements MyInterface {

    public NinjaEmployee(int ID, String Name, double salary) {
        super(ID, Name, salary);
    }

    public void moveNinja() {
        System.out.println("Ninja Moved");
    }

}
在我的代码中没有意义的接口:

public interface MyInterface {

   public void moveNinja();
   public void startWorking();

}
主要类别:

public static void main(String[] args){
    MyInterface em = new NinjaEmployee(123,"Sandro",1000000);
    em.moveNinja();
    em.startWorking();
}
我的问题如下:

1) 具体/技术上,测试中询问了什么


2) 对于给定的问题,什么是正确的方法/代码?

您不能创建2个类的1个对象 您可以扩展该类,以便在实例化子类时调用父类构造函数 然后可以在该构造函数中创建另一个类的对象

在数组中添加员工,并添加选项以在忍者中添加员工?1.是还是2.不是?
如果是,添加到忍者。然后在main方法中,使用for循环逐个打印忍者的名称

我不知道正确答案(任务的定义有点不严格,有一些不清楚的时刻),但我会这样做:

public interface IAmNinja {
   public void moveNinja();
}

public interface IAmEmployer {
   public void startWorking();
}

public class NinjaEmployee implements IAmNinja, IAmEmployer {
    private Ninja _ninja;
    private Employer _employer;

    public NinjaEmployee(int ID, String Name, double salary) {
        _employer = new Employer(ID, Name, salary);
        _ninja = new Ninja();
    }

    public void moveNinja() {
        _ninja.moveNinja();
    }

    public void startWorking() {
        _employer.startWorking();
    }
}

问得好。
问题的关键是:

  • 我们应该使用一个接口
  • 忍者类应该有一些方法(而不是属性)
  • 所以我们应该尽量利用这些关键点

    我在下面提供了一个类图:

    首先:我们有
    Employee
    类,并像其他简单类一样实现它。它有一些实现的属性和类

    其次:我们有一个名为
    Ninja\u Interface
    的接口,其中包含一些关于忍者的方法声明。(
    moveNinja1
    moveNinja2

    第三个
    Ninja
    类,该类实现了(或实现了)
    Nijna\u接口
    ,并且在
    Ninja\u接口
    中实现了一些方法声明

    第四类:NinjaEmployee类。它继承自
    员工
    。因此,它拥有所有
    员工的属性和方法。它还实现了忍者界面
    。因此,它应该实现所有的
    Ninja_接口
    方法声明。另一方面,
    NinjaEmployee
    有一个
    Ninja
    的实例(注意,
    Ninja
    类实现了所有
    Ninja\u接口
    方法)
    So,在
    Ninja\u Employee
    类中,在
    Ninja\u接口
    方法的实现中,可以使用
    Ninja
    实例方法调用

    例如,
    NinjaEmployee
    的某些部分如下代码所示:

    private Ninja ninja=new Ninja();
    public void moveNinja1()
    {
        ninja.moveNinja1();
    }
    public void moveNinja2()
    {
        ninja.moveNinja2();
    }
    
    主要问题是:为什么
    忍者
    应该只有一些方法
    这是因为
    Ninja
    类只是
    Ninja\u接口
    方法的实现,不需要属性。因此,
    忍者类的实例是相同的。因此,我们可以将
    NinjaEmployee
    中的
    Ninja
    属性声明为静态属性


    最后:我们也可以将忍者的一些属性添加到
    NinjaEmployee
    类中。

    @OleV.V。你认为这是解决给定问题的正确方法吗?我觉得缺少了一些东西,因为我缺乏一些概念方面的理论知识“…而不必从任何一个原始类复制方法实现代码”。您已将
    moveNinja
    方法从
    Ninja
    复制到
    NinjaEmployee
    ,因此我认为您没有完全满足要求。我会认为作文(如果你们知道它的意思的话)。我知道我做不到,若你们仔细阅读这篇文章,我会给出最初的任务,我想知道对于给定的问题,正确的方法会是什么?只有一个界面??很难看:)也许你们更注重结果,但我更喜欢更好的设计。是的,我们可以使用继承作为一种讨厌的手段来拉动实现,我们甚至可以最终得到0-1000个接口,但是。。。你想做编程还是黑客?我觉得你帮的太多了。OP将从自己解决作业中学到更多。你的方法很好。