2013-03-15 79 views
1

我是一名Java初学者,我想了解抽象类。 下面是我写的代码;问题是:我如何编写一个将返回该类的实例的方法。如何编写一个返回抽象类实例的方法?

public abstract class VehicleEngine 
{ 
    protected String name; 
    protected double fabricationCons; 
    protected double consum; 
    protected int mileage; 

    public VehicleEngine(String n, double fC) 
    { 
     name = n; 
     fabricationCons = fC; 
     mileage = 0; 
     consum = 0; 
    } 

    private void setFabricationCons(double fC) 
    { 
     fabricationCons = fC; 
    } 

    public abstract double currentConsum(); 

    public String toString() 
    { 
     return name + " : " + fabricationCons + " : " + currentConsum(); 
    } 

    public void addMileage(int km) 
    { 
     mileage += km; 
    } 

    public double getFabricationConsum() 
    { 
     return fabricationCons; 
    } 

    public String getName() 
    { 
     return name; 
    } 

    public int getMileage() 
    { 
     return mileage; 
    } 

    //public VehicleEngine get(String name){ 
    //if(getName().equals(name)){ 
    //return VehicleEngine; 
    //} 
    //return null; 
    //} 
} 

public class BenzinVehicle extends VehicleEngine 
{ 
    public BenzinVehicle(String n, double fC) 
    { 
     super(n, fC); 
    } 

    @Override 
    public double currentConsum() 
    { 
     if (getMileage() >= 75000) { 
      consum = getFabricationConsum() + 0.4; 
     } else { 
      consum = getFabricationConsum(); 
     } 
     return consum; 
    } 
} 

public class DieselVehicle extends VehicleEngine 
{ 
    public DieselVehicle(String n, double fC) 
    { 
     super(n, fC); 
    } 

    @Override 
    public double currentConsum() 
    { 
     int cons = 0; 
     if (getMileage() < 5000) { 
      consum = getFabricationConsum(); 
     } else { 
      consum = getFabricationConsum() + (getFabricationConsum() * (0.01 * (getMileage()/5000))); 
     } 
     return consum; 
    } 
} 

这是主要的。

public class Subject2 
{ 
    public static void main(String[] args) 
    { 
     VehicleEngine c1 = new BenzinVehicle("Ford Focus 1.9", 5.0); 
     DieselVehicle c2 = new DieselVehicle("Toyota Yaris 1.4D", 4.0); 
     BenzinVehicle c3 = new BenzinVehicle("Citroen C3 1.6",5.2); 

     c1.addMileage(30000); 
     c1.addMileage(55700); 
     c2.addMileage(49500); 
     c3.addMileage(35400); 

     System.out.println(c1); 
     System.out.println(c2); 
     System.out.println(VehicleEngine.get("Citroen C3 1.6")); //this is the line with problems 
     System.out.println(VehicleEngine.get("Ford Focus ")); 
    } 
} 

和输出应该是:

Ford Focus 1.9 : 5.0 : 5.4 
Toyota Yaris 1.4D : 4.0 : 4.36 
Citroen C3 1.6 : 5.2 : 5.2 
null 
+0

看看[工厂模式](http://en.wikipedia.org/wiki/Factory_method_pattern)。 – 2013-03-15 20:15:28

回答

3

你可以不是根据定义返回一个抽象类的实例。你可以做的是返回一个扩展它的具体(非抽象)子类的实例。例如,在VehicleEngine内部,您可以创建一个工厂,该工厂返回给定实例类型和预期参数的实例,但这些实例必须是具体的子类VehicleEngine

1

看一看的Factory Method模式。具体的类将实现一个返回类实例的抽象方法。

0

抽象类不会保留它们的列表实例。实际上没有Java类做到这一点。如果你真的想这样做,你可以添加一个静态映射到VehicleEngine这样的:

private static Map<String, VehicleEngine> instanceMap = new HashMap<String, VehicleEngine>(); 

,改变你的get方法一个静态这样的:

public static VehicleEngine get(String name) { 
    return instanceMap.get(name); 
} 

,并加入这一行VehicleEngine的构造函数的末尾:

VehicleEngine.instanceMap.put(n, this); 

这种方式创建的每个新的实例使自己进入静态地图。但是,这实际上不是实现这种功能的好方法。您可以尝试使用工厂来创建实例,或者如果预定义的实例数量有限,则可以考虑将此类转换为枚举类型。

相关问题