9

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

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(非通用)接口的唯一方法是显式的,你们如何将其抽象化?

4

2 回答 2

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();
  }
}
于 2012-07-13T15:07:57.067 回答
4

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

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

    object IBook.GetFormat()
    {
        return GetFormat();
    }
}
于 2012-07-13T15:15:54.367 回答