首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >泛型和非泛型接口

泛型和非泛型接口
EN

Stack Overflow用户
提问于 2012-07-13 23:01:14
回答 2查看 2.9K关注 0票数 9

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

代码语言:javascript
复制
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 (非泛型)接口的唯一方法是显式,那么你们该如何让它变得抽象呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-13 23:15:54

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

代码语言:javascript
复制
public abstract class BookBase : IBook<FormatBase>, IBook
{                
    public abstract FormatBase GetFormat();

    object IBook.GetFormat()
    {
        return GetFormat();
    }
}
票数 4
EN

Stack Overflow用户

发布于 2012-07-13 23:07:57

只需委派:

代码语言:javascript
复制
public abstract class BookBase : IBook<FormatBase> {
  public abstract FormatBase GetFormat();

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

或者,如果您仍然希望区分这两种方法,请委托给一个新方法:

代码语言:javascript
复制
public abstract class BookBase : IBook<FormatBase> {
  public abstract FormatBase GetFormat();

  public abstract object IBook_GetFormat();

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

您还需要new来避开“隐藏继承的成员”警告:

代码语言:javascript
复制
public interface IBook<F> : IBook 
where F : FormatBase {
  new F GetFormat();
}

此外,让具体类决定具体的FormatBase可能更有意义。

代码语言:javascript
复制
public abstract class BookBase<F> : IBook<F> 
where F : FormatBase {
  public abstract F GetFormat();

  object IBook.GetFormat() {
    return GetFormat();
  }
}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11473084

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档