2016-03-20 48 views
3

我需要制作一个程序,使用几种算法来创建随机迷宫。 我已经定义了以下类:(它是数据类型算法将使用,T是在特定实现中使用的类型,例如,如果我使用2D矩阵来表示迷宫,T将是2D点)C#泛型在接口中,编写泛型算法

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 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); 
} 

它定义了一种行为随机generatble迷宫必须提供。

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 MatrixMaze : IMaze<Point2D>, IRandomGeneratable<Point2D> {...} 
class GraphMaze : IMaze<Node>, IRandomGeneratable<Node> {...} 

我的问题是,当我尝试实施的方法产生,编译器问我具体的T,而算法不(也不应该)依赖于T,我不想写相同的算法,只适用于不同的T。有没有办法编写单独的代码,这将独立于T的工作?

+0

你可以添加代码中的错误是什么? – Kalten

回答

0

你应该稍微改变迷宫生成器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(); 
    } 
}