gpt4 book ai didi

C#接口(interface)中的泛型,编写泛型算法

转载 作者:行者123 更新时间:2023-11-30 18:21:09 24 4
gpt4 key购买 nike

我需要制作一个使用多种算法来创建随机迷宫的程序。我定义了以下类:(这是算法将使用的数据类型,T 是特定实现中使用的类型,例如如果我使用 2D 矩阵表示迷宫,T 将是 2D 点)

class Entry<T>
{
private T elem; //the data saved in each entry
public T Elem
{
get { return elem; }
set { this.elem = value; }
}

public Entry(T elem)
{
Elem = elem;
}

public override int GetHashCode()
{
return Elem.GetHashCode();
}
}

以及以下接口(interface):

interface IRandomGeneretableMaze<T>
{
void SetRandomEntrance();
void SetRandomExit();
List<Entry<T>> GetNextPossibleEntries(Entry<T> entry);
void MakePath(Entry<T> entry1, Entry<T> entry2);
void RemovePath(Entry<T> entry1, Entry<T> entry2);
}

它定义了随机生成的迷宫必须提供的行为。

interface IMaze<T>
{
Entry<T> GetEntrance();
Entry<T> GetExit();
List<Entry<T>> GetNextMoves(Entry<T> entry);
}

它定义了迷宫使用的一些通用方法。 (迷宫正在以几种不同的方式实现)

interface IRandomMazeGenerator<T>
{
IMaze<T> Generate(Type t);
}

它只定义了一个迷宫生成器,每个算法将以不同的方式实现,而 t 只是要创建的迷宫类型。 (对于 Matrix 基础实现可能是 1,对于基于图形的实现可能是 2 等等)。假设我已经完成了以下类(class):

class MatrixMaze : IMaze<Point2D>, IRandomGeneratable<Point2D> {...}
class GraphMaze : IMaze<Node>, IRandomGeneratable<Node> {...}

我的问题是当我尝试实现生成方法时,编译器要求我提供一个具体的 T,而算法不(也不应该)依赖于 T,我不想写同样的东西算法,只针对不同的 T。有没有一种方法可以编写独立于 T 工作的单段代码?

最佳答案

您应该稍微更改迷宫生成器 API,以便它可以生成任何类型的迷宫:

public interface IRandomMazeGenerator<TMaze,T> where TMaze: IMaze<T>, new(){
TMaze Generate();
}
public class MatrixMaze : IMaze<Point2D>{public MatrixMaze(){..}}
public class EmptyMazeGenerator<TMaze,T> : IMazeGenerator<TMaze,T> where T: IMaze<T>,new(){
public TMaze Generate(){
return new TMaze();
}
}

或者,如果您不想在 IMaze<T> 上添加约束要有一个默认构造函数,传递一个 Func<IMaze<T>>到发电机 - 然后你有一个Builder适用于 Factory (在 Gang Of Four Patterns 中查找)

public interface IRandomMazeGenerator<T>{
IMaze<T> Generate(Func<IMaze<T>factory);
}

public class EmptyMazeGenerator<T> : IMazeGenerator<T>{
public IMaze<T> Generate(Func<IMaze<T>factory){
return factory();
}
}

关于C#接口(interface)中的泛型,编写泛型算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36114454/

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