我们能否使用另一个类的构造函数来初始化一个对象?

3
我们可以使用另一个类的构造函数来初始化一个对象吗?
class1 object = new class2();

4
好的。最好选择一种语言。 - juanchopanza
5个回答

3
只要 class2 扩展(或在接口的情况下实现)了 class1 就可以了。例如:List<String> list = new ArrayList<>(); 明确一下,你正在创建一个 class2 的实例(或我的示例中的 ArrayList)。恰好你已经声明了变量的类型为 class1(或 List)。

这对于需要一些高级行为但不关心实现细节的情况非常有用。例如,您的API可能公开一个以“Map”作为参数的函数,但您不关心参数是“HashMap”还是“TreeMap”。尽可能通用地声明类型是一个好习惯,因为这有助于解耦、代码可读性和维护(重构)等方面的问题。 - Emil Lundberg
针对Java编程语言而言:"extends" => "继承或实现" - laune

2
这只能在C++中实现。
class1 object1 = new class2();

拥有一个隐式转换 class2*class1 之间的构造函数将会很方便。可以通过转换构造函数来实现:
struct class1
{
  class1(const class2*);
};

无论这是否构造了一个类的构造函数来“帮助”构建另一个对象,取决于您通过“帮助构建”所指的内容。
如果您的意思是:
class1 object1 = class2();

如果要进行转换构造函数,则需要通过值或引用方式使用class2。例如:

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

类型之间不需要存在is-a关系。


1

仅就C++而言:这是可能的,但是类需要具有多态的“is a”关系(在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));

编辑: 与此同时,楼主删除了C++标签,因此我的答案不再相关。


这些类不需要“is-a”关系,只需要一个转换构造函数。 - juanchopanza

1
只有当class2是class1的子类时才可能发生。这被称为多态性。
class Class1{
 /*
  *
  *
  body of class1
  *
  */
 }


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

然后你可以声明:

Class1 object1 = new Class2();

希望这有所帮助。


0
class class1{}
class class2 extends class1{}

如果在类层次结构中存在父子关系,那么这并不是问题。 因此, class1 object1 = new class2(); 是有效的。实际上,在内部发生的是你拥有一个class2对象,但它被一个class1变量引用。
但是,如果你像下面这样:
class class1{}
class class2{}

那么这个不起作用


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接