Можно ли инициализировать объект с помощью конструктора другого класса?Можно ли инициализировать объект с помощью конструктора другого класса?
class1 object = new class2();
Можно ли инициализировать объект с помощью конструктора другого класса?Можно ли инициализировать объект с помощью конструктора другого класса?
class1 object = new class2();
Пока class2
распространяется (или орудия в случае интерфейса) class1
, что это хорошо. Например, List<String> list = new ArrayList<>();
Чтобы было ясно, вы создаете экземпляр class2
(или ArrayList
из моего примера). Так получилось, что вы указали свою переменную типа class1
(или List
).
Это полезно, когда вам нужно какое-то поведение на высоком уровне, но не заботятся о деталях реализации. Например, ваш API может выставить функцию, которая принимает «Map» в качестве аргумента, но вам все равно, является ли аргумент «HashMap» или «TreeMap». Это хорошая практика, чтобы объявить ваши типы как можно более общие, поскольку это помогает с развязкой, считыванием кода и обслуживанием (рефакторингом) все в одном. –
Выступая за Java: «extends» => «extends or реализует» – laune
Только для 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 имеют никакого отношения больше.
Классы не требуют отношения «is-a», а просто конвертирующего конструктора. – juanchopanza
class class1{}
class class2 extends class1{}
Если у вас родительские отношения с дочерними элементами в иерархии классов, то это не проблема. Тогда class1 object1 = new class2();
действительно Фактически, что происходит внутри, вы имеете объект class2, но на который ссылается переменная class1.
, но если у вас есть как
class class1{}
class class2{}
Тогда это не работает
Его возможно только если class2 s подкласс class1. Это называется полиморфизмом.
class Class1{
/*
*
*
body of class1
*
*/
}
class Class2 extends Class1{
/*
*
*
body of class2
*
*/
}
Тогда вы можете объявить
Class1 object1 = новый Class2();
Надеется, что это помогло ..
Единственный способ для этого, чтобы работать в C++
class1 object1 = new class2();
будет иметь неявное преобразование между class2*
и class1
. Это может быть достигнуто с помощью преобразующего конструктора:
struct class1
{
class1(const class2*);
};
ли это является с помощью конструктора класса, чтобы «помочь» построить объект другого из них зависит от того, что вы имеете в виду, помогая строить.
Если вы имели в виду
class1 object1 = class2();
затем преобразования конструктор должен был бы принять class2
по значению или по ссылке.Например,
struct class1
{
class1(const class2&);
};
Там нет необходимости в есть- отношения между типами.
Да. Лучше выбрать один язык. – juanchopanza