【发布时间】:2014-03-05 12:48:58
【问题描述】:
我在试图解决这个问题时迷失了方向,下面是我的代码的一个节略示例。我的问题是,当我从 Bar 对象实例化 Note 对象时,Bar 构造函数被调用 again 然后创建另一个 Note 对象,依此类推,直到出现堆栈溢出错误。
这种递归是否有原因?如何正确创建子类的实例以防止它发生?
编辑:我正在尝试实现一个父类 Bar 的实例与子类的多个实例 Note。这样,每次我创建父类 Bar 时,它都会创建自己的一组注释。这是否必须使用没有任何继承关系的类(只是一个单独的 Bar 和 Note 类)来完成? 我需要在子类中有一个函数(由于其他原因,我不能将此函数移动到父类)调用父类中的一个函数,这将使用 base.RemoveNote(this) 破坏该子类的实例; 有没有更好的方法来做到这一点,或者有没有办法从子类的同一个实例中销毁子类的实例?
代码:
class Bar
{
private List<Note> notes;
public Bar()
{
notes = new List<Note>(0);
notes.Add(new Note())
}
public void removeNote(Note note)
{
notes.Remove(note);
}
}
class Note : Bar
{
public Note()
{
//do stuff
base.RemoveNote(this);
}
}
public MainWindow()
{
private Bar newBar = new Bar();
}
【问题讨论】:
-
当然会。这就是继承的工作原理……当您有子/父关系时,所有子类都会从父类调用/初始化。默认构造函数被调用。您的代码似乎也不正确。为什么子类会创建父类的实例? (此处为家长注意)。
-
我到处都看到这是子类的定义 注意(注意:Bar)csharp-station.com/Tutorial/CSharp/lesson08 我应该如何从父类创建子类,我希望子类是注意.谢谢,
-
你确定Note 扩展栏吗?
-
@user2056201 - 反转您的代码。使 Bar 派生自 Note
-
看起来 Bar 和 Note 之间的关系应该是“Has”而不是“Is”看看这里的一些答案:stackoverflow.com/questions/2218937/…