gpt4 book ai didi

c# - 递归约束 : What does DBase : where T : DBase mean?

转载 作者:行者123 更新时间:2023-11-30 14:45:23 25 4
gpt4 key购买 nike

在我遇到这个问题之前,我以为我理解了通用约束。

public class DBase<T> : DbContext, IDisposable where T : DBase<T>

T怎么可能是DBase<T> ?
如果可以,那意味着什么?
此代码编译并运行良好。我不是在解决问题。我只是不明白。

这里用到了

    public class ChildDb : DBase<ChildDb>

同样,这对我来说没有意义。它将自身作为类型参数传递?

最佳答案

How can T be DBase<T>?

没有阻止通用参数从自身派生的限制。虽然用你给出的例子不能直接理解。 Vertex / Vertice怎么样?

摘自维基百科:

enter image description here

In geometry, a vertex (plural: vertices or vertexes) is a point where two or more curves, lines, or edges meet. As a consequence of this definition, the point where two lines meet to form an angle and the corners of polygons and polyhedra are vertices.1

如何描述顶点(一个点)?

// very simplified example
public class Vertex
{
public int X { get; set; }
public int Y { get; set; }
}

现在我们如何向此类添加相关 Verticies 的集合,但只允许从此类派生的东西?

public class Vertex<TVertex> : Vertex
where TVertex : Vertex<TVertex>
{
public IEnumerable<TVertex> Vertices { get; set; }
}

它是 say 的通用版本:

public Vertex2
{
public IENumerable<Vertex2> Vertices { get; set; }
}

然而,当我从 Vertex2 派生时,我的 Vertices永远必须是IEnumerable<Vertex2> , 而让 Vertices 成为派生类的正确方法是使用这种自引用泛型。

I'm sorry Erik, I lost the point in the details. What have I gained by the recursion?

使用 Vertex2 ,我们的派生类型将失去对其他派生属性的访问:

public class MyVertex2: Vertex2
{
public int Id { get; set; }
}

所以

var a = new MyVertex2 {Id = 1 };
var b = new MyVertex2 { Id = 2 };
a.Vertices = new List<Vertex2> { b };
b.Vertices = new List<Vertex2> { a };

// can't access Id because it's a Vertex2 not a MyVertex2
var bId = a.Vertices.First().Id;

当然你可以转换它,但你会在任何地方转换它(那不是 DRY )...如果它不是 MyVertex(MullReferencesException 或 InvalidCastException)怎么办。

public class MyVertex: Vertex<MyVertex>
{
public int Id { get; set; }
}
var a = new MyVertex {Id = 1 };
var b = new MyVertex { Id = 2 };
a.Vertices = new List<MyVertex > { b };
b.Vertices = new List<MyVertex > { a };

var bId = a.Vertices.First().Id;
// or even
var aId = a.Vertices.First().Vertices.First();

每次我们导航到一个顶点时,我们都会得到正确的派生类型,而不是基类。

关于c# - 递归约束 : What does DBase<T> : where T : DBase<T> mean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53983914/

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