2016-03-20 9 views
3

ランダムな迷路を作成するためにいくつかのアルゴリズムを使用するプログラムを作成する必要があります。 私は以下のクラスを定義しました:(アルゴリズムが使用するデータ型です.Tは特定の実装で使用される型です。たとえば、迷路を表すために2D行列を使用した場合、Tは2D点になります)C#generics in interface、generic algorithm

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を作成する迷路のちょうどタイプであるが、各アルゴリズムは、異なる方法で実装されるであろう。 (マトリックスベースの実装の場合1、グラフベースの実装の場合2など)。アルゴリズムはありません(とすべきではない)しながら、具体的なTのために私に尋ねる

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

私はメソッドを実装しようとすると、私の問題があり、コンパイラが生成されますのは、私は次のクラスを作ったと仮定しましょうTに依存していて、私は同じアルゴリズムを書こうとはしません。異なるTに対してのみです。 Tの独立して動作するコードの単一の部分を書く方法はありますか?

+0

エラーがあるコードを追加することはできますか? – Kalten

答えて

0

それが迷路の任意の種類を生成することができますので、あなたは少し迷路ジェネレータのAPIを変更する必要があります:あなたが合格、デフォルトコンストラクタを持つことがIMaze<T>上の制約を追加したくない場合は、

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

代わりに発電機へFunc<IMaze<T>> - あなたが持っている、その後Factoryと連携Builder(でそれを見て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(); 
    } 
}