2013-08-01 5 views
0

В этой ситуации у меня есть доступ к переопределенным/дополнительным методам CarSubClass?Возвращаемый подкласс вместо класса

public Car getCar(){ 
CarSubClass carSub = new CarSubClass(); 
return carSub; 
} 

Update:

Автомобиль имеет подклассы SubClass1, SubClass2, SubClass3.

getCar() может возвращать SubClass1, SubClass2, или SubClass3.

Могу ли я сделать это ?:

Car car = getCar(); 

switch(car.getType()){//getType() returns a byte 

case SubClass1: 

SubClass1 car1 = (SubClass1)car; 
break; 

case SubClass2: 
SubClass car2 = (SubClass2)car; 
break; 

case SubClass3: 
SubClass3 car3 =(SubClass3)car; 
break; 

default: //don't do anything 

} 
+0

Что с в коммутаторе, от которого вы получите тип? – arjacsoh

+0

Частое понижение частоты иногда является показателем плохого дизайна ООП. Возможно, вам захочется проверить обсуждения предпочтительного состава над наследованием, например. http://www.artima.com/lejava/articles/designprinciples4.html – Will

+0

Спасибо, я прочитаю – benzabill

ответ

1

Только переопределены методы:

Car car = getCar(); 
car.method(); // here you can invoke only the overridden methods in CarSubClass 

Вы не можете вызвать дополнительные методы CarSubClass которых ссылочный тип Car не имеет никакого знания. Это не сработает во время самой компиляции.

Вероятно, это возможно, но вы должны быть уверены, что вы делаете здесь:

CarSubClass c = (CarSubClass)getCar(); 
c.subClassSpecificMethod(); 

выше литье безопасно в вашем случае, поскольку метод всегда возвращает экземпляр CarSubClass. Однако лучше выполнить чек.

Car c = getCar(); 
if(c instanceof CarSubClass){ 
    ((CarSubClass)c).subClassSpecificMethod(); 
} 

switch(c.getType())

Это не является допустимым ключом выключатель.

JLS§14.11:

Тип выражения должен быть символом, байты, короткий, Int, символы, байты, короткое, целое число, строка, или перечисление (§8.9), или compile- возникает временная ошибка.

+0

Итак, скажем, у меня есть куча разных подклассов для автомобиля, есть ли способ вернуть машину, а затем бросить эту машину на любой тип автомобиля? Я делаю это в методе get или в том месте, где вызывается getCar? – benzabill

+0

Это то, что вы только что добавили, с тем, что я опубликовал в своем обновлении? Я считаю, что это то же самое (я набрал мое обновление до того, как увидел ваш ответ) – benzabill

+0

Хорошо, я не писал, что c.getType() возвращает байт. Спасибо за помощь :) – benzabill

1

Да, благодаря динамическому набору/вызову он будет доступен. В этом и заключается цель полиморфизма.

Но так как вы возвращаете экземпляр Car, в зависимости от того, какой класс, который вызывает «getCar()» , должен сначала передать его на «CarSubClass».

Car.java

public class Car { 

public void a() { 
    System.out.println("In Car"); 
} 

}

CarSubClass.java

enter code herepublic class CarSubClass extends Car { 

@Override 
public void a() { 
    System.out.println("In CarSubClass"); 
} 

public static void main(String[] args) { 
    Car c = new CarSubClass(); 
    c.a(); 
} 

} 

Выведет:

'In CarSubClass' 

Edit: Я отредактировал свой ответ. Вся эта концепция называется полиморфизмом.Вы не обязаны бросать, так как во время выполнения динамический тип, который имеет переменная, будет гарантировать, что будет вызван правильный метод.

+0

Итак, скажем, у меня есть куча разных подклассов для автомобиля, есть ли способ вернуть машину, а затем бросить эту машину на любой тип автомобиля? Я делаю это в методе get или в том месте, где вызывается getCar? – benzabill

+0

Я отредактировал свой ответ. Вся эта концепция называется полиморфизмом. Вы не обязаны бросать, так как во время выполнения динамический тип, который имеет переменная, будет гарантировать, что будет вызван правильный метод. – Rabiees

0

Нет, если вы не указали его на CarSubClass. Ниже в качестве примера (на самом деле плохой, хотя):

public class Test { 

    public static Car getCar() { 
     return new SmallCar(); 
    } 

    public static void main(String[] args) throws Exception { 
     ((SmallCar) getCar()).getMake(); 
    } 

    static class Car { 

     String model; 

     public String getModel() { 
      return this.model; 
     } 
    } 

    static class SmallCar extends Car { 

     String make; 

     public String getMake() { 
      return this.make; 
     } 
    } 
} 

удачи ...

Смежные вопросы