2016-03-20 87 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(); 
    } 
}