我在C ++ Tenmplates上找到了一个不错的链接:

http://www.cplusplus.com/doc/tutorial/templates/

并且需要在C#中类似的东西。我有一个似乎可行的解决方案,但希望其他人就如何与上述链接(特别是专业化部分)建立联系。

这是我想出的概念证明:

public abstract class Piece
{
    public object Value { get; set; }
}

public class Rook : Piece
{
    public void Capture()
    {
        int i = (int)this.Value;
    }
}

public class Pawn : Piece
{
    public void CaptureEnPassant()
    {
        string s = (string)this.Value;
    }
}

public class PieceFactory<P, T> where P : Piece, new()
{

    P p;

    public PieceFactory(T value)
    {
        p = new P();
        p.Value = value;
    }

    public P GetPiece()
    {
        return p;
    }
}


然后最后打电话到工厂,我这样做:

var piece = new PieceFactory<Pawn, string>("exd6").GetPiece();

piece.CaptureEnPassant();


我已经看到了不同的解决方案,例如使用扩展方法和其他方式...

只是想看看我的思维方式是否符合良好模式。

非常感谢,

大卫

最佳答案

我的意见是,您的草图比必要的更为复杂和混乱。为什么基类在每个派生类中都有一个具有不同含义和不同类型的“值”?为什么会有一个工厂接受一个类型参数,该类型参数必须是一个特定的类型参数,如果不是,那么程序在运行时会崩溃?摆脱所有那些脆弱,混乱,脆弱的东西。如果pawn需要一个字符串,则在Pawn上创建一个公共的构造函数,该函数需要一个字符串,故事的结尾。这里根本不需要工厂模式。

不要太爱这个工具,您会用它来构建实际上没有任何意义的东西。通用类型非常适合诸如收集类之类的事情。它们不适用于国际象棋领域。

09-28 01:14