gpt4 book ai didi

c# - 派生类中的无意基类构造函数 "hiding"

转载 作者:太空宇宙 更新时间:2023-11-03 23:20:11 24 4
gpt4 key购买 nike

[注意:编写代码只是为了显示问题,而不是因为它本身就有用。]

假设我有两个类,AB:

public class A {

public const int max = 2;
public int[] id;

public A() {
this.id = new int[A.max];
}

public A(int id) : this() {
this.id[0] = id;
}

public A(int id, int id2) : this() {
this.id[0] = id;
this.id[1] = id2;
}
}

public class B : A {

public B(int[] ids) : base() {
int x = 0;
while ( ( x < ids.Length ) && ( x < A.max ) ) {
this.id[x] = ids[x];
x++;
}
}
}

似乎通过在 B 中创建新的构造函数,我无意中隐藏了所有通常由 BA 中“继承”的构造函数(事实上,我知道构造函数在 C# 中不是继承的,但我在这里仍然感到困惑)。

例如:

A first = new A();  // fine

int[] x = new int[A.max-1];
B second = new B(x); // fine

B third = new B(12); // nope

如果我从 B 中删除新的构造函数,那么 B third = new B(12); 就可以正常工作(在我的术语中,构造函数不是“隐藏”了)。但是随着 B 中的新构造函数,我不再可以使用 A(int) 构造函数。

那么解决方案真的只是简单地重新定义所有我希望 B 从 A 继承并使它们为空的构造函数吗?示例:

public class B : A {

public B(int id) : base(id) {} // adding this!

public B(int[] ids) : base() {
int x = 0;
while ( ( x < ids.Length ) && ( x < A.max ) ) {
this.id[x] = ids[x];
}
}
}

如果我进行更改,现在 B third = new B(12); 就可以正常工作了。但是我必须重新定义我想在派生类的基类中使用的每个构造函数,这似乎有点难看,仅仅是因为我要向那个派生类添加一个新的构造函数!

最佳答案

是的,派生类不获取也不公开基类的构造函数。您需要在基类中定义所有必要的构造函数(可能调用基类的构造函数)。

注意:如果您的派生类没有任何需要初始化的东西,您可能需要重新考虑您是否真的需要新类。

关于c# - 派生类中的无意基类构造函数 "hiding",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35689874/

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