通用和非通用接口

Blu*_*eon 9 c# generics

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

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

由于声明IBook(非泛型)接口的唯一方法是明确的,你们如何将其抽象化呢?

Jor*_*dão 7

委托:

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

  object IBook.GetFormat() {
    return GetFormat();
  }
}
Run Code Online (Sandbox Code Playgroud)

或者,如果您仍想要区分这两种方法,请委托给新方法:

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

  public abstract object IBook_GetFormat();

  object IBook.GetFormat() {
    return IBook_GetFormat();
  }
}
Run Code Online (Sandbox Code Playgroud)

你还需要new躲避"隐藏继承成员"的警告:

public interface IBook<F> : IBook 
where F : FormatBase {
  new F GetFormat();
}
Run Code Online (Sandbox Code Playgroud)

此外,让具体课程决定具体内容可能更有意义FormatBase:

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

  object IBook.GetFormat() {
    return GetFormat();
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 警告如果清楚:"如果隐藏意图,则使用`new`关键字".由于隐藏意图,"新"的用法很好. (2认同)

Ser*_*kiy 4

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

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

    object IBook.GetFormat()
    {
        return GetFormat();
    }
}
Run Code Online (Sandbox Code Playgroud)