2016-03-08 3 views
1

Im пытается создать arraylist, который содержит по крайней мере два экземпляра каждого класса, мне нужно добиться этого, используя один arraylist. Проблема состоит в том, что класс HourlyWorker и ContractWorker реализуют абстрактный класс Smarty, где класс Хоббит реализует абстрактный класс Simpleton и я не могу понять, как использовать оба в одном arraylist.Наследование с двумя абстрактными классами

public class MainClass { 

private ArrayList<Smarty> list; 

    public MainClass() { 
     list = new ArrayList<Smarty>(); 
     list.add(new HourlyWorker("Bob", 50, 40, 8.0)); 
     list.add(new HourlyWorker("Bill", 70, 50, 12.0)); 
     list.add(new ContractWorker("Jill", 80, 8, 100.0)); 
     list.add(new ContractWorker("Amy", 125, 12, 85.0)); 
     list.add(new Hobbit("Frodo", 12)); 
     list.add(new Hobbit("Merry", 8)); 
    } 

Та часть, которая оленья кожа работа

list.add(new Hobbit("Frodo", 12)); 
list.add(new Hobbit("Merry", 8)); 

Также абстрактный класс Smarty реализует Юродивый

все мои классы

абстрактный класс Smarty

public abstract class Smarty extends Simpleton { 
    private int IQ; 
    public Smarty(){ 

    } 

    public Smarty(String name, int IQ) { 
     setFirstName(name); 
     this.IQ = IQ; 
    } 

    public Smarty(int IQ){ 
     this(); 
     this.IQ = IQ; 
    } 

    public int getIQ(){ 
     return IQ; 
    } 
    public void setIQ(int IQ){ 
     this.IQ = IQ; 
    } 

    public abstract double getIncome(); 

} 

абстрактного класса Юродивого

public abstract class Simpleton { 
    private String name; 
    public Simpleton(){ 

    } 
    public Simpleton(String name){ 
     this.name = name; 
    } 
    public String getFirstName(){ 
     return name; 
    } 
    public void setFirstName(String name){ 
     this.name = name; 
    } 
    public abstract String getName(); 

    public abstract String doMath(); 

    public abstract String saySomethingSmart(); 
} 

класса HourlyWorker

public class HourlyWorker extends Smarty{ 
private int hoursWorked; 
private double hourlyPay; 

public HourlyWorker(String name,int IQ, int hoursWorked, double hourlyPay){ 
    super(IQ); 
    setFirstName(name); 
    setHoursWorked(hoursWorked); 
    this.hourlyPay = hourlyPay; 
} 

public int getHoursWorked(){ 
    return hoursWorked; 
} 
public void setHoursWorked(int hoursWorked){ 
    this.hoursWorked = hoursWorked; 
} 
public double getHourlyPay(){ 
    return hourlyPay; 
} 
public void setHourlyPay(double hourlyPay){ 
    this.hourlyPay = hourlyPay; 
} 
public String multiply(int x, int y){ 
    return x + " x " + y + " = " + x * y; 
} 

@Override 
public String getName() { 
    // TODO Auto-generated method stub 
    return getFirstName(); 
} 

@Override 
public String doMath() { 
    // TODO Auto-generated method stub 
    return "I can Multiply! " + multiply(2, 3); 
} 

@Override 
public String saySomethingSmart() { 
    // TODO Auto-generated method stub 
    return "Hippos are dangerous!"; 
} 

@Override 
public double getIncome() { 
    // TODO Auto-generated method stub 
    double x = getHoursWorked(); 
    double y = getHourlyPay(); 
    double income = x * y; 
    return income; 
} 

} 

класса ContractWorker

public class ContractWorker extends Smarty{ 
private int contractsCompleted; 
private double payPerContract; 

public ContractWorker(String name,int IQ, int contractsCompleted, double payPerContract) { 
    // TODO Auto-generated constructor stub 
    super(IQ); 
    setFirstName(name); 
    this.contractsCompleted = contractsCompleted; 
    this.payPerContract = payPerContract; 
} 
public int getContractsCompleted(){ 
    return contractsCompleted; 
} 
public void setContractsCompleted(int contractsCompleted){ 
    this.contractsCompleted = contractsCompleted; 
} 
public double getPayPerContract(){ 
    return payPerContract; 
} 
public void setPayPerContract(double payPerContract){ 
    this.payPerContract = payPerContract; 
} 
public String division(int x, int y){ 
    return x + "/" + y + " = " + x/y; 
} 

public double getIncome() { 
    // TODO Auto-generated method stub 
    double x = getContractsCompleted(); 
    double y = getPayPerContract(); 
    double income = x*y; 
    return income; 
} 
@Override 
public String doMath() { 
    // TODO Auto-generated method stub 
    return ": I can do division! " + division(10,2); 
} 
@Override 
public String saySomethingSmart() { 
    // TODO Auto-generated method stub 
    return ": The stars are aligned tonight."; 
} 
@Override 
public String getName() { 
    // TODO Auto-generated method stub 
    return getFirstName(); 
} 

} 

класса Хоббит

public class Hobbit extends Simpleton{ 
private int carrots; 

public Hobbit(String name, int carrots){ 
    super(name); 
    this.carrots = carrots; 
} 
public int getCarrotsPicked(){ 
    return carrots; 
} 
public void setCarrotsPicked(int carrots){ 
    this.carrots = carrots; 
} 
public String add(int x, int y){ 
    return x + " + " + y + " = " + x+y; 
} 

@Override 
public String getName() { 
    // TODO Auto-generated method stub 
    return getFirstName(); 
} 

@Override 
public String doMath() { 
    // TODO Auto-generated method stub 
    return "I can add! " + add(2,2); 
} 

@Override 
public String saySomethingSmart() { 
    // TODO Auto-generated method stub 
    return "Leave me alone Sam!"; 
} 

} 

ответ

0

Это не работает, потому что класс Хоббит делает не реализовать абстрактный класс Smarty.

Вы говорите: «Класс HourlyWorker и ContractWorker реализуют абстрактный класс Smarty, где класс Хоббит реализует абстрактный класс Simpleton» и что Smarty реализует Simpleton.

Проблема легко видеть, когда вы создаете дерево:

Simpleton / \ Smarty Hobbit / \ HourlyWorker ContractWorker

Как вы можете видеть, Хоббит не реализует абстрактный класс Smarty.

Итак, когда вы создаете объект ArrayList для объектов Smarty, вы не можете поместить объект Hobbit, потому что это не Smarty.

Вместо этого сделайте вместо ArrayList объекты Simpleton. Ваши три не абстрактных класса - все дети Simpleton, поэтому вы можете поместить их в Simpleton ArrayList.

ArrayList<Simpleton> list = new ArrayList<Simpleton>(); 

Затем ваши операции добавления должны работать нормально.

+0

Большое вам спасибо за вашу помощь, после того, глядя на дереве он все нажали на меня. –

0

Сделать свой список содержит объекты типа Simpleton, так как это является общим предком всех объектов, которые вы хотите хранить в списке:

public MainClass() { 
    list = new ArrayList<Simpleton>(); 
    list.add(new HourlyWorker("Bob", 50, 40, 8.0)); 
    list.add(new HourlyWorker("Bill", 70, 50, 12.0)); 
    list.add(new ContractWorker("Jill", 80, 8, 100.0)); 
    list.add(new ContractWorker("Amy", 125, 12, 85.0)); 
    list.add(new Hobbit("Frodo", 12)); 
    list.add(new Hobbit("Merry", 8)); 
} 
Смежные вопросы