2013-03-15 3 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)을 확인하십시오. –

답변

3

아니요은 정의에 따라 추상 클래스의 인스턴스를 반환 할 수 있습니다. 당신이 할 수있는 일은 그것을 확장하는 구체적인 (비 추상적 인) 서브 클래스 중 하나의 인스턴스를 반환하는 것입니다. 예를 들어, VehicleEngine 내부에는 인스턴스와 예상되는 매개 변수의 유형 주어진 인스턴스를 반환하는 공장을 만들 수 있지만 그 경우는 반드시 목록을 보관하지 않습니다 VehicleEngine

1

Factory Method 패턴에서보세요. 구체적인 클래스는 클래스 인스턴스를 반환하는 추상 메서드를 구현합니다.

0

추상 클래스의 구상 서브 클래스해야 할 것이다 그 인스턴스. 사실 자바 클래스는 그렇게하지 않습니다.

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

과 같은 정적 하나에 get 메소드를 변경 : 당신이 정말로 그렇게하려면 다음과 같이 VehicleEngine하기 위해 정적지도를 추가 할 수

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

과에이 줄을 추가 VehicleEngine의 생성자의 말 :

VehicleEngine.instanceMap.put(n, this); 

만든 모든 새 인스턴스가 정적지도에 자신을두고 이런 식으로. 그러나 실제로 이러한 기능을 구현하는 좋은 방법은 아닙니다. 팩토리를 사용하여 인스턴스를 만들거나 제한된 미리 정의 된 인스턴스 수가있는 경우이 클래스를 열거 형으로 변환 할 수 있습니다.

관련 문제