我的问题如下。我为一个显然不工作的家庭项目做了代码设计。也许你可以帮我弄清楚“代码味道”来自哪里。抽象泛型类型变量的声明
好了,让我们开始: 我已经定义了一些类环绕不同类型的档案类型:
public abstract class Archive { }
public class ZipArchive : Archive { }
public class TarArchive : Archive { }
与那些档案处理,我定义的管理类。 一个抽象定义所需的行为,
public abstract class ArchiveManager<T> where T : Archive
{
public abstract void OpenArchive(T archive);
}
和具体的,实际实现的具体行为体:
public class ZipArchiveManager : ArchiveManager<ZipArchive>
{
public override void OpenArchive(ZipArchive archive) { /* .. */ }
}
public class TarArchiveManager : ArchiveManager<TarArchive>
{
public override void OpenArchive(TarArchive archive) { /* .. */ }
}
什么,现在的情况是,在编译的时候,我不知道是什么样档案我会处理的,所以我试过如下:
class Program
{
static void Main(string[] args)
{
ArchiveManager<Archive> archiveManager = null;
if (/*some condition*/) {
archiveManager = new ZipArchiveManager();
}
else {
archiveManager = new TarArchiveManager();
}
}
}
从而结束了以下错误:
Cannot implicitly convert type 'ZipArchiveManager' to 'ArchiveManager'
据我所知,泛型参数不能隐式转换。有什么办法可以解决这个问题吗?这个代码/设计是否“闻”?
非常感谢您提前。
创建非泛型基类,或使用协变接口。 – CodesInChaos 2012-04-15 09:29:31
另外,'OpenArchive'的签名对我来说看起来是错误的。它不应该收到一个流,并返回'T'? – CodesInChaos 2012-04-15 09:30:44