【发布时间】:2012-07-13 15:01:13
【问题描述】:
我遇到过很多情况,我声明了一个泛型接口,后来我需要这个接口的非泛型版本,或者至少是该接口上某些方法或属性的非泛型版本。 我通常会声明一个新的非泛型接口并让它继承泛型接口。 我遇到的问题如下例所示:
public abstract class FormatBase { }
public interface IBook<F> where F : FormatBase
{
F GetFormat();
}
public interface IBook
{
object GetFormat();
}
public abstract class BookBase : IBook<FormatBase>, IBook
{
public abstract FormatBase GetFormat();
object IBook.GetFormat()
{
return GetFormat();
}
}
既然声明 IBook(非泛型)接口的唯一方法是显式声明,那么你们如何将其抽象化?
【问题讨论】:
-
这并不能解决您的问题,但您不认为将其设为
BookBase<T> : IBook<T>, IBook where T : FormatBase可能有意义吗?否则,至少在您的简单示例中,拥有IBook<T>而不仅仅是IBook几乎没有任何好处。 -
你是对的。我更新代码。但是非泛型抽象的问题仍然存在。
-
您还将获得一个“'IBook
.GetFormat()' 隐藏继承的成员 'IBook.GetFormat()'。如果要隐藏,请使用新关键字。”警告。这可能是由于某处设计决策不佳,但如果没有更多信息,很难说出更好的设计会是什么。 -
与你的问题无关,但也许你想让
F中的通用接口协变,说public interface IBook<out F>? -
我又做了一项更改以删除“使用新关键字...”消息。 IBook
不再从 IBook 继承。谢谢大家