2013-10-28 5 views
1
class A { 
. 
. 
. 
} 

class B extends A { 
. 
. 
. 
} 

A var = new B() работает. Но когда мне нужно это сделать, а не просто B var = B()? Что это меняет? Что-то другое при использовании var.method() или var.field?Когда делать Суперкласс var = Подкласс()

+2

Полиморфизм. Иногда вы хотите лечить группу Bs и As as As. Это позволяет вам выполнять общие действия над всем, что наследует от A, и вы можете использовать отношения 'is a'. –

+0

Вы имеете в виду, конечно, 'A var = new B();' – vikingsteve

ответ

1

если вы делаете A var = new B();, вы также можете назначить var = new C(), если C extends A. Это принцип полиморфизма. Вы можете назначить экземпляры нескольких классов, которые проходят тест IS-A для класса A.

0

Но когда мне это нужно, а не просто B var = B()? > Какая разница?

Я часто использую абстрактный тип при объявлении переменного, но присвоить экземпляр конкретного типа к нему:

List<Integer> list = new ArrayList<Integer>(); 

Это делает его легче заменить другую реализацию конкретного списка на более позднем этапе ,

0

Вы бы использовали самый суперкласс или идеальный интерфейс, который подходит. Это свидетельствует о том, в коде минимальной функциональности вам нужно, и если вам нужно изменить код из

A var = new B(); 

в

A var = new C(); // C also extends A 

Это тривиально. Однако, если вы используете B всюду, вы делаете mroe работу для себя позже, чтобы изменить и проверить код.

Единственным исключением является то, что вы можете сделать объект слишком общим и пропустить некоторое важное поведение. например

void methodIsInSet(Set<T> set); 

может быть заменен

void methodIsInSet(Collection<T> set); 

как методы одинаковы, но оставляет то, что может быть важным предположения о дубликатах и ​​т.д.

0

Вы обычно не сделать это в простое заявление, такое как A var = new B(), поэтому ваше наблюдение во многих случаях правильное. Тем не менее, вы будете использовать его как-то ти

public A CreateAnObject(int i) 
{ 
    if (i = 0) 
     return new A(); 
    else 
     return new B(); 
} 

Теперь вы можете сделать A var = CreateAnObject(something). И var будет либо A, либо B.

+1

Я всегда это делаю при использовании классов Collections.Подобно 'List myList = new ArrayList();' – Matthias

+0

Хорошо, это хороший момент. Таким образом, это в основном «если вы знаете, что вам нужен только интерфейс A, объявите var как A». На самом деле хороший совет. – PMF

0

Дело 1. JDBC - пример. Интерфейс Connection, Statemet используется для ссылки на объекты, но поставщик реализует для вас класс, например, ConnectionImpl и StatementImpl (здесь мы никогда не беспокоимся об именах.).

Корпус 2: Интерфейс является общим представлением и реализацией конкретного представления. при использовании интерфейса одна и та же ссылка может быть полезна для других объектов класса реализации.

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