C# 通用和非通用接口

C# 通用和非通用接口,c#,generics,C#,Generics,我遇到过很多情况,在这些情况下,我声明了一个通用接口,后来我需要这个接口的非通用版本,或者至少需要该接口上某些方法或属性的非通用版本。 我通常会声明一个新的非泛型接口,并让它继承泛型接口。 我在中遇到的问题如下例所示: public abstract class FormatBase { } public interface IBook<F> where F : FormatBase { F GetFormat(); } public interface IBook {

我遇到过很多情况,在这些情况下,我声明了一个通用接口,后来我需要这个接口的非通用版本,或者至少需要该接口上某些方法或属性的非通用版本。 我通常会声明一个新的非泛型接口,并让它继承泛型接口。 我在中遇到的问题如下例所示:

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();
    }
}
公共抽象类FormatBase{}
公共接口IBook,其中F:FormatBase
{
F GetFormat();
}
公共接口IBook
{
对象GetFormat();
}
公共抽象类书库:IBook,IBook
{
公共摘要FormatBase GetFormat();
对象IBook.GetFormat()
{
返回GetFormat();
}
}
既然声明IBook(非泛型)接口的唯一方法是显式声明,你们如何将其抽象化?

只需委托:

public abstract class BookBase : IBook<FormatBase> {
  public abstract FormatBase GetFormat();

  object IBook.GetFormat() {
    return GetFormat();
  }
}
public abstract class BookBase : IBook<FormatBase>, IBook
{                
    public abstract FormatBase GetFormat();

    object IBook.GetFormat()
    {
        return GetFormat();
    }
}
另外,让具体类决定具体的
FormatBase
,可能更有意义:

public abstract class BookBase<F> : IBook<F> 
where F : FormatBase {
  public abstract F GetFormat();

  object IBook.GetFormat() {
    return GetFormat();
  }
}
公共抽象类书库:IBook
其中F:FormatBase{
公共摘要F GetFormat();
对象IBook.GetFormat(){
返回GetFormat();
}
}

为什么不能编写显式接口的实现,而不是将其声明为抽象接口

public abstract class BookBase : IBook<FormatBase>, IBook
{                
    public abstract FormatBase GetFormat();

    object IBook.GetFormat()
    {
        return GetFormat();
    }
}
公共抽象类书库:IBook,IBook
{                
公共摘要FormatBase GetFormat();
对象IBook.GetFormat()
{
返回GetFormat();
}
}

这并不能解决您的问题,但您是否认为将其设置为
书库:IBook,IBook where t:FormatBase
?否则,至少在您的简单示例中,使用
IBook
而不仅仅是
IBook
几乎没有任何好处。您是对的。我更新代码。但是非泛型摘要的问题仍然存在。您还将得到一个“'IBook.GetFormat()'隐藏继承的成员'IBook.GetFormat()'。如果要隐藏,请使用new关键字。”警告。这可能是因为某个地方的设计决策很差,但是如果没有更多的信息,很难说什么是更好的设计。与您的问题无关,但可能您希望在
F
中使通用接口协变,比如说
公共接口IBook
?我又做了一次更改,删除了“使用新关键字…”消息。IBook不再从IBook继承。谢谢guys@spender,我看没有更好的方法了,是吗?@spender:使用
new
或更改名称。。。因为OP想要相同的名字,他要么使用
new
,要么得到警告。。。。我不知道你的情况,但我不喜欢被人警告我有意做出的决定……将此与.NET自己的接口
IEnumerable
进行比较,后者源自
IEnumerable
。它还存在此方法签名冲突(签名一致,返回类型不一致)。他们在编译mscorlib时是否有此警告,或者他们是否会说
new
?如果警告清除:“如果打算隐藏,请使用
new
关键字”。因为隐藏是有意的,所以
new
的用法很好。@JeppeStigNielsen:既然这是一个有意的决定,我敢打赌我的马(如果我有)他们使用
new
…完美!这正是我要找的。@Jordão释放触发器:)@spender这行命令BookBase的继承者编写它们的实现GetFormat@spender我建议添加
GetFormat
实现。这就是我的想法:)糟透了。我今天过得不好。别理我。
public abstract class BookBase : IBook<FormatBase>, IBook
{                
    public abstract FormatBase GetFormat();

    object IBook.GetFormat()
    {
        return GetFormat();
    }
}