- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我很惭愧地承认我在这个问题上坐了很多很多小时。但我只想按照我在下面的图表中构建它的方式来实现它....
我想用大陆/国家/州和城市来模拟世界。每个模型都有一个对其父项的引用和一个对其子项的引用列表,除了世界只有子项(因为它不能有父项)并且城市只有一个父项引用因为它不会更深。 (我想实现它,例如“World”没有父字段,同样“city”没有 List<Children>
字段。
为了让您了解接口(interface)代码,我在此处包含了它的最低限度:
public interface IRoot<TChild>
{
List<TChild> Children { get; set; }
void AddChild(TChild child);
}
public interface ILeaf<TParent>
{
TParent Parent { get; set; }
}
public interface INode<TParent, TChild> : IRoot<TChild>, ILeaf<TParent> { }
还有一些实现代码:
public class Root<TChild> : IRoot<TChild>
{
public List<TChild> Children { get; set; }
public void AddChild(TChild child) { //... }
}
public class Leaf<TParent> : ILeaf<TParent>
{
public TParent Parent { get; set; }
}
public class Node<TParent, TChild> : INode<TParent, TChild>
{
private IRoot<TChild> root;
private ILeaf<TParent> leaf;
//...
}
最后是我要构造的类的代码:
public class World : Root<Continent> { }
public class Continent : Node<World, Country> { }
public class Country : Node<Continent, State> { }
public class State : Node<Country, City> { }
public class City : Leaf<City> { }
问题来了:
现在在 Root<TChild>.AddChild(TChild)
中添加一个子对象我需要访问 <TChlid>.Parent
所以我需要限制通用 TChild
至 ILeaf<IRoot<TChild>>
像这样:
public class Root<TChild> : IRoot<TChild> where TChild : ILeaf<Root<TChild>>
{
public void AddChild(TChild child)
{
child.Parent = this;
}
}
但是这样做,我得到了错误
CS0311 C# The type cannot be used as type parameter in the generic type or method. There is no implicit reference conversion from to.
在这一行
public class World : Root<Continent> { }
最佳答案
最后,我找到了解决办法。它包括制作基类 Root<TChild>
和 Node<TParent, TChild>
抽象的。设置子项的父级被委托(delegate)给一个抽象方法。在具体实现中,泛型类型参数已经被解析,那么访问Parent
就没有问题了。属性(property)。
我也稍微改变了界面。将 children 暴露为 List<TChild>
是有问题的,因为它允许任何人绕过 AddChild
的添加逻辑通过直接添加到列表并忘记设置 child 的 parent 。
我还制作了 Parent
属性在接口(interface)中是只读的,因为 setter 仅在实现中使用。
public interface IRoot<TChild>
{
IReadOnlyList<TChild> Children { get; }
void AddChild(TChild child);
}
public interface ILeaf<TParent>
{
TParent Parent { get; }
}
public interface INode<TParent, TChild> : IRoot<TChild>, ILeaf<TParent>
{
}
基类:
public abstract class Root<TChild> : IRoot<TChild>
{
private List<TChild> _children = new List<TChild>();
public IReadOnlyList<TChild> Children => _children;
public void AddChild(TChild child)
{
_children.Add(child);
SetChildsParent(child);
}
protected abstract void SetChildsParent(TChild child);
}
public class Leaf<TParent> : ILeaf<TParent>
{
public TParent Parent { get; internal set; }
}
public abstract class Node<TParent, TChild> : Root<TChild>, INode<TParent, TChild>
{
public TParent Parent { get; internal set; }
}
请注意 Node
继承自 Root
, 因此我们只需要补充一个 ILeaf
实现。
具体实现类:
public class World : Root<Continent>
{
protected override void SetChildsParent(Continent child) => child.Parent = this;
}
public class Continent : Node<World, Country>
{
protected override void SetChildsParent(Country child) => child.Parent = this;
}
public class Country : Node<Continent, State>
{
protected override void SetChildsParent(State child) => child.Parent = this;
}
public class State : Node<Country, City>
{
protected override void SetChildsParent(City child) => child.Parent = this;
}
public class City : Leaf<State> { }
关于c# - 我如何制作一个树数据结构,它可以为 parent 和 child 提供两种不同的泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54811035/
我的收藏具有以下结构 { _id:1, parent_id:0 } { _id:2, parent_id:1 } { _id:3, parent_id:1 } { _id:4, par
到目前为止,我已经尝试过获取该对象的所有子对象,但它只带来了两个子对象。不都是 child 的 child 。我如何获取所有内容并循环获取特定名称对象 Transform[] objChild = g
这个问题不太可能对任何 future 的访客有帮助;它只与一个较小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,通常不适用于全世界的互联网受众。如需帮助使此问题更广泛适用,visit the
我有一个如下表 好吧,在这个表中每个用户都有一个父用户,那么如果我们选择一个用户,那么它的 id 、子代 id 和子代子代 id 应该作为数组返回。我需要一个查询来获取 Rails 中的这些值,而不使
我需要以下代码的帮助: HTML: process process 在点击 td[class=process] 时,我需要 input[name=dat
好的,所以我从中获得了一个 PHP,该 PHP 由依赖于手头动态情况的切换循环传播(我认为)。现在,当我添加一个复选框时,我希望能够使 div 中的第一个复选框具有顶部边框和侧面,没有底部。下面的只有
我正在使用 Swift 和 Sprite Kit。我有一个名为 MrNode 的 SKNode,它有多个 SKSpriteNodes 和 SKNode 子节点。一些SKNode有子节点,而这些子节点也
对不起,这个标题太俗了,但我真的不确定如何解释这个,我是新一代的 SQL 技能由于事件记录模式而退化的人之一! 基本上我在 PostgreSQL 中有三个表 客户端(一个客户端有很多 map ) -
我有这样的简单表格: 编号 parent_id 创建于 具有父/子关系...如果一行是子行,则它有一个 parent_id,否则它的 parent_id 为 0。 现在我想选择所有没有子项(因此本身)
所以我有这样的结构: 我的问题是:如何从每个主题中删除 ID 为 3Q41X2tKUMUmiDjXL1BJon70l8n2 的每个字段。我正在考虑这样的事情: admin.database().ref
这个问题在这里已经有了答案: Change opacity on all elements except hovered one (1 个回答) 关闭 5 个月前。 因此,当鼠标悬停在 child
我需要在 Delphi 5 中创建一个 QuickReport,其布局如下: +================ | Report Header +================ +========
假设我有这样的 html: Some more detailed code.... 我想知道如何在CSS中使用“A
我有一个使用 flexbox 的类似表格的布局: +--------------+---------------+-----------------+---------------+ | 1
我有一个关联,其中 user has_many user_items 和 user_items has_many user_item_images。与一个已经退出的用户。我可以创建一个新的 user_
我想选择无序列表中的前两个列表项。我可以这样选择第一项: ul li:nth-child(1) a { background: none repeat scroll 0 0 beige; }
ul li:first-child a { border-radius: 5px 5px 0 0; } ul li:last-child a { border-radius: 0 0 5p
我有一个这样的表:
或者这些术语用于指代同一事物? 我正在尝试在我的 Win32 应用程序中实现一些显示位图图像的自定义按钮。一个教程指出我应该使用 CreateWindow() 创建子窗口。 但是,我已经从另一个关于创
我想在 jquery 中获取我的 svg 的 id,我尝试了这个 jquery,但它是未定义的。 $(event.target).children('svg').attr("id") Target.e
我是一名优秀的程序员,十分优秀!