【问题标题】:How to reference all instances of a generic class?如何引用泛型类的所有实例?
【发布时间】:2011-07-12 16:24:57
【问题描述】:

我还没有完全理解泛型的一个方面。

假设我有一个通用类:

public abstract SomeClass<T> where T : SomeInterface
{
    public bool DoSomethingsWithT(T theItem)
    {
        //doStuff!!!
    }

    public virtual bool IsActive
    {
       get { return true; }  
    }
}

所以基本上我假设继承这个类的版本是活动的,但我允许它们中的一些定义自己的。

稍后我将一个对象放入一个我知道类型为 SomeClass&lt;T&gt; 但 T 可以是实现 SomeInterface 的任何类的方法中

public bool SomeMethod(object item)
{
    var something = item as SomeClass;

    return something.IsActive;
}

但这当然行不通,因为没有名为 SomeClass 的类,我也不能这样做 SomeClass&lt;SomeInterface&gt;,因为即使另一个类确实继承自它,我也无法强制转换它。

这通常是如何完成的?我们是否应该创建一个名为SomeClass 的类,SomeClass&lt;SomeInterface&gt; 继承自该类,并在该类中定义IsActive 属性。

如果我要创建一个继承 SomeClass&lt;SomeInterface&gt; 的项目集合,我会遇到同样的问题。

【问题讨论】:

    标签: c# generics inheritance abstract-class


    【解决方案1】:

    如何从一个类派生/实现一个包含常见行为的接口:

    interface IIsActive
    {
        bool IsActive{get;}
    }
    

    【讨论】:

    • 这将是解决这里问题的好方法,为此点赞。但我主要是在询问有关引用泛型类的问题。
    【解决方案2】:

    在泛型类上使用接口实现:

    interface ISomeClass
    {
        bool IsActive {get;}
    }
    
    public abstract SomeClass<T> : ISomeClass where T : SomeInterface
    {
        public bool DoSomethingsWithT(T theItem)
        {
            //doStuff!!!
        }
    
        public virtual bool IsActive
        {
           get { return true; }  
        }
    }
    
    public bool SomeMethod(object item)
    {
        var something = item as ISomeClass;
    
        return something.IsActive;
    }
    

    【讨论】:

    • 所以我的假设是正确的,正如你和丹涛所说。所以基本上我会让接口拥有独立于T的所有类成员以及依赖于通用版本内T的所有类成员?
    【解决方案3】:

    我们是否应该创建一个名为 SomeClass 的类,即 SomeClass&lt;SomeInterface&gt; 继承自该类并在该类中定义IsActive 属性。

    是的,这正是你应该做的(通常也是这样做的)。

    或者您可以关注spender's advice 并使用接口而不是抽象类。这可能会更好,因为它可以实现相同的目标,而不会将您限制在严格的类型层次结构中。

    【讨论】:

      【解决方案4】:

      使用接口而不是类实现

      public bool SomeMehtod(object item)
      {
          return ((SomeInterface)item).IsActive;
      }
      

      刚刚意识到您定义的 IsActive 属性不在界面中。

      那么最好的办法就是判断类是否为SomeClass,然后返回IsActive

      public bool SomeMethod(object item)
      {
          var something = item as SomeClass;
          if (something != null)
          {
              return something.IsActive;
          }
          else
          {
              return somethingElse;
          }
      }
      

      【讨论】:

      • 那行不通...项目是 SomeClass,而不是 SomeInterface
      【解决方案5】:

      不确定我是否正确,但此方法签名是否适用于 SomeMethod?

          public bool SomeMethod(SomeClass<SomeInterface> item)
          {            
              return item.IsActive;
          }
      

      【讨论】:

      • 第二个代码块不起作用:InvalidCastException“无法将'ConcreteType'类型的对象转换为'SomeClass`1[SomeInterface]'类型。”
      • @Jacob:很公平 - 如果不实施它就不确定。已将其删除。
      • 那么 SomeMethod 可能是某个抽象类的重写方法,我无法控制配置文件。例如,可能是 SortingMethod,但我知道被排序的集合是 SomeClass 类型。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-27
      相关资源
      最近更新 更多