【发布时间】:2019-06-16 19:50:10
【问题描述】:
举个例子:
class Foo {
public int SomeProperty { get; }
public IEnumerable<Foo> Children { get; }
// ....
}
如果另一个类(例如Bar)实现Foo,则Foo 变为非递归的,而Bar 变为递归的。
class Bar {
public Foo { get; } // At this point Foo.Children doesn't make sense anymore
public IEnumerable<Bar> Children { get; } // How can I enforce this part
// ...
}
目前我需要为每个类编写两个版本,一个带有Children,一个没有。继承使这稍微不那么乏味,但我不能静态地保证需求将被正确实现。我也在考虑某种更高种类的单子模式Recursive,但我无法理解它(特别是因为我刚刚开始学习它)。
有什么想法吗?
编辑:我不明白它是如何被标记为重复的。虽然我最终编写了自己的通用树,但我的问题中并没有要求它,也绝对没有要求图书馆。我正在寻求有关如何解决问题的一般建议,而我解决的解决方案最终偶然成为了通用树。 在我提供了我的解决方案之后这个问题被关闭的事实让我相信有人阅读了答案,在 SO 上搜索了树,然后选择了第一个结果,这对任何人都没有帮助。 “原始”问题甚至没有为我的问题提供解决方案。这只不过是懒惰加上滥用管理员权限。
【问题讨论】:
-
Bar"implement"Foo在这里如何? -
C# 中没有“当存在具有特定属性的子类时静态更改父类”这样的东西。
-
我真的不明白你的目的是什么
-
C# 不支持这种变化——
Children的类型在继承时不能改变。如果不需要继承,可以使用interface IFoo<T> where T : IFoo<T> { IEnumerable<T> Children { get; } },然后让Foo和Bar分别实现IFoo<Foo>和IFoo<Bar>。如果您使用显式实现,您可以实际上将其与继承结合起来,但这会有点混乱。 -
可能无法做到这一点。类似问题:stackoverflow.com/q/8727523
标签: c# design-patterns