如何表达同时应该是2个不同类的对象

时间:2017-12-13 12:43:36

标签: java oop interface polymorphism

今天我在OOP进行了测试,我接到了以下任务代码:

  

想象一下,你有两个类:Employee(代表一名员工)和Ninja(代表一名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");
    }
}

班级NinjaEmployee:

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)给定问题的正确方法/代码是什么?

3 个答案:

答案 0 :(得分:0)

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

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();
    }
}

答案 1 :(得分:0)

好问题。
问题的关键点是:

  1. 我们应该使用一个界面。
  2. 忍者类应该有一些方法(不是属性)。
  3. 所以我们应该尝试使用这些关键点。

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

    enter image description here

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

    其次:我们有一个名为Ninja_Interface的接口,它有一些关于忍者的方法声明。 (moveNinja1moveNinja2

    第三Ninja实现(或已实现)Nijna_Interface的类,并在Ninja_Interface中实现了任何方法声明。

    第四NinjaEmployee类。它继承自Employee。所以它具有所有Employee的属性和方法。它还实现了Ninja_Interface。所以它应该实现所有Ninja_Interface方法声明。另一方面,NinjaEmployee的实例为Ninja(注意Ninja类实现了所有Ninja_Interface方法)。
    所以,在Ninja_Employee类中,在Ninja_Interface方法的实现中,我们可以使用Ninja实例方法来调用。

    例如NinjaEmployee的某些部分就像下面的代码:

    private Ninja ninja=new Ninja();
    public void moveNinja1()
    {
        ninja.moveNinja1();
    }
    public void moveNinja2()
    {
        ninja.moveNinja2();
    }
    

    主要问题是:为什么Ninja应该只有一些方法
    这是因为Ninja类只是Ninja_Interface方法的实现,并且不需要具有属性。所以Ninja类的实例是相同的。因此,我们可以将Ninja中的NinjaEmployee属性声明为静态属性

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

答案 2 :(得分:-1)

你不能创建2个类的1个对象 您可以扩展类,因此只要实例化子类,它就会调用父类构造函数 然后,您可以在该构造函数中创建另一个类的对象

在阵列中添加员工并添加选项以在忍者中添加员工? 1.yes或2.no? 如果是的话,添加到ninja ..然后在main方法中使用for循环逐个打印ninja名称