gpt4 book ai didi

c# - 是否可以从基类构造函数调用派生类构造函数?

转载 作者:行者123 更新时间:2023-11-30 16:00:27 25 4
gpt4 key购买 nike

我有一个抽象基类,我从中派生了两个类。抽象类有一个 protected 字段,它由派生类中的构造函数初始化。每个派生类都有两个构造函数,每个类的第一个构造函数初始化字段,第二个构造函数通过调用第一个构造函数修改第一个构造函数的初始化。两个派生类的第二个构造函数完全相同,但两个派生类的第一个构造函数不同。有什么方法可以将第二个构造函数放在基类中吗?

下面是一个例子来说明我想说的:

public abstract class A {
protected int[] field1;

public void someMethod() {
//somethingsomething
}
}

public class B : A {
public B() {
//body X
//this initializes field1 in some way
}

public B(bool p) : this() {
//body Y
//this initializes field1 in some way + modification
}
}

public class C : A {
public C() {
//body Z
//this initializes field1 in another way
}

public C(bool p) : this() {
//body Y
//this initializes field1 in another way + modification
}
}

我想做的是找到一些方法,以便不必重复 body Y 两次。我正在考虑将 B(bool p)C(bool p)body Y 放在 class A< 的构造函数中 作为 A(bool p),然后让 B(bool p)C(bool p) 调用基类构造函数: base(bool p) 后跟一个空主体,但随后意识到基类构造函数必须调用派生类构造函数。

这对我来说也很愚蠢。虽然我不确定,但这是因为我有这种感觉,从基类调用派生类的东西是只能在运行时完成的事情,而且在编译时确实没有办法检查这一点。我只是想找到一种方法来遵循 DRY 原则。

谢谢。

最佳答案

简短的回答:没有。那将打破面向对象的范式,因此您无论如何都不会希望能够做到这一点。这样想:抽象基类可以扩展任意数量的类,但如果它与其中一个子类紧密耦合,那将如何影响其他子类?

public class BaseClass {
// Call child class constructor
public BaseClass() : A() { }
}

public class A : BaseClass {
public A() { ... }
}

// How should BaseClass handle this? There is no constructor named "A."
public class B : BaseClass {
public B() { ... }
}

如果希望基类和派生类共享一些功能,应该在基类中将其设为 protected 方法。这样,您就可以从构造函数中调用该方法。

您还可以在提供通用功能的基类上创建构造函数,并使用 : base(...) 从子类调用它。

关于c# - 是否可以从基类构造函数调用派生类构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40180019/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com