2014-08-03 7 views

ответ

3

Пока class2 распространяется (или орудия в случае интерфейса) class1, что это хорошо. Например, List<String> list = new ArrayList<>();

Чтобы было ясно, вы создаете экземпляр class2 (или ArrayList из моего примера). Так получилось, что вы указали свою переменную типа class1 (или List).

+0

Это полезно, когда вам нужно какое-то поведение на высоком уровне, но не заботятся о деталях реализации. Например, ваш API может выставить функцию, которая принимает «Map» в качестве аргумента, но вам все равно, является ли аргумент «HashMap» или «TreeMap». Это хорошая практика, чтобы объявить ваши типы как можно более общие, поскольку это помогает с развязкой, считыванием кода и обслуживанием (рефакторингом) все в одном. –

+0

Выступая за Java: «extends» => «extends or реализует» – laune

1

Только для C++: возможно, но классы требуют полиморфного отношения «есть» (публичное наследование в C++). Например:

class class1 { }; 
class class2 : public class1 
{ 
    class2(int) {} 
}; 


class1* object1 = new class2(42); // A pointer is needed (in C++) 
delete object1; 

// better would be: 
std::unique_ptr<class1> object1(new class2(42)); 

Edit: Между тем нить нож удалили C++ - Tag, так что мой ответ doens't имеют никакого отношения больше.

+0

Классы не требуют отношения «is-a», а просто конвертирующего конструктора. – juanchopanza

0
class class1{} 
class class2 extends class1{} 

Если у вас родительские отношения с дочерними элементами в иерархии классов, то это не проблема. Тогда class1 object1 = new class2(); действительно Фактически, что происходит внутри, вы имеете объект class2, но на который ссылается переменная class1.

, но если у вас есть как

class class1{} 
class class2{} 

Тогда это не работает

1

Его возможно только если class2 s подкласс class1. Это называется полиморфизмом.

class Class1{ 
/* 
    * 
    * 
    body of class1 
    * 
    */ 
} 


class Class2 extends Class1{ 
/* 
    * 
    * 
    body of class2 
    * 
    */ 
} 

Тогда вы можете объявить

Class1 object1 = новый Class2();

Надеется, что это помогло ..

2

Единственный способ для этого, чтобы работать в C++

class1 object1 = new class2(); 

будет иметь неявное преобразование между class2* и class1. Это может быть достигнуто с помощью преобразующего конструктора:

struct class1 
{ 
    class1(const class2*); 
}; 

ли это является с помощью конструктора класса, чтобы «помочь» построить объект другого из них зависит от того, что вы имеете в виду, помогая строить.

Если вы имели в виду

class1 object1 = class2(); 

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

struct class1 
{ 
    class1(const class2&); 
}; 

Там нет необходимости в есть- отношения между типами.

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