我遇到很多情况,我声明了一个通用接口,后来我需要这个接口的非泛型版本,或者至少是该接口上某些方法或属性的非泛型版本。 我通常会声明一个新的非泛型接口并让它继承通用接口。 我遇到的问题在下面的示例中显示:
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(非泛型)接口的唯一方法是明确的,你们如何将其抽象化呢?
答案 0 :(得分:7)
请委托:
public abstract class BookBase : IBook<FormatBase> {
public abstract FormatBase GetFormat();
object IBook.GetFormat() {
return GetFormat();
}
}
或者,如果您仍希望区分这两种方法,请委托新方法:
public abstract class BookBase : IBook<FormatBase> {
public abstract FormatBase GetFormat();
public abstract object IBook_GetFormat();
object IBook.GetFormat() {
return IBook_GetFormat();
}
}
您还需要new
躲避“隐藏继承的成员”警告:
public interface IBook<F> : IBook
where F : FormatBase {
new F GetFormat();
}
此外,让具体课程决定具体的FormatBase
:
public abstract class BookBase<F> : IBook<F>
where F : FormatBase {
public abstract F GetFormat();
object IBook.GetFormat() {
return GetFormat();
}
}
答案 1 :(得分:4)
为什么你不能编写显式接口的实现,而不是将其声明为抽象?
public abstract class BookBase : IBook<FormatBase>, IBook
{
public abstract FormatBase GetFormat();
object IBook.GetFormat()
{
return GetFormat();
}
}