【问题标题】:Types in interfaces c#接口c#中的类型
【发布时间】:2015-04-29 21:09:28
【问题描述】:

在 java 中,如果我有类似的东西,它似乎可以工作,但在 c# 版本中:

 public interface MyIterator<T>: IEnumerator<T>
 {
    BaseClass<T> GetBaseClass();
 }

还有:

   public interface IBaseClass<T>: IEnumerator<T>{
         bool Remove(T e);

        IEnumerator<T> Search(T e); 

        bool Contains(T e);

        bool IsEmpty();

        int Size();
   }

但在实现中我有:

  public abstract class BaseClass<T> : IBaseClass<T>
    {  

  public MyIterator<T> Search(T e)
        {
..}

它不允许我有不同的返回类型,唯一允许的返回类型是IEnumerator&lt;T&gt;(来自界面)。我知道它有点连线,但这就是在给定上下文中的要求。示例,其他类如:

public class SpecializedContainer<T> : BaseClass<T>

将使用 BaseClass)

【问题讨论】:

  • 嗯,您的第一个代码 sn-p 无效 - 您根本没有显示 ET 是什么。我认为它们应该是某处的类型参数,但您没有显示它们......
  • @Jon Both T ..generic type ,我会编辑我的帖子
  • 但是您还没有在任何地方将T 声明为类型参数。你的意思是MyIterator&lt;T&gt;
  • 是的,抱歉,我不只是复制粘贴代码,我错过了

标签: java c# interface extends


【解决方案1】:

您缺少类型参数,IBaseClass 的定义应该有一个类型参数 T(除非它们是另一个类的一部分)。

你确定IBaseClass 实现IEnumerator&lt;T&gt; 吗?通常它会实现IEnumerable&lt;T&gt;

它不允许我有不同的返回类型,唯一允许的是 IEnumerator(来自接口)。

这对于接口实现是不可避免的,但是显式接口实现允许您拥有单独的公共方法。

只需创建两个方法,一个返回MyIterator&lt;T&gt;public 和一个返回IEnumerator&lt;T&gt; 的显式接口实现。

public abstract class BaseClass<T> : IBaseClass<T>
{
    public MyIterator<T> Search(T e)
    {
        //Do something here
    }

    IEnumerator<T> IBaseClass<T>.Search(T e)
    {
        return Search(e);
    }
}

这将导致调用BaseClass&lt;T&gt;.Search 的类型为MyEnumerator&lt;T&gt;,调用IBaseClass&lt;T&gt;.Search 的类型为IEnumerator&lt;T&gt;(根据接口的要求)。当然请注意,无论哪种情况,实际值都是MyEnumerator&lt;T&gt; 类型。

【讨论】:

    猜你喜欢
    • 2015-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-24
    • 2012-06-22
    • 1970-01-01
    • 2014-08-31
    相关资源
    最近更新 更多