如何引用泛型类的所有实例?

4

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

假设我有一个泛型类:

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

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

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

现在稍后,我将在方法中获取一个对象,我知道它将是类型为SomeClass<T>的对象,但T可以是实现SomeInterface的任何类。

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

    return something.IsActive;
}

但是这当然行不通,因为没有名为SomeClass的类,我也不能做SomeClass<SomeInterface>,即使另一个类确实从中继承,我也无法进行转换。

通常应该如何处理?我们应该创建一个名为SomeClass的类,该类继承SomeClass<SomeInterface>,并在该类中定义IsActive属性。

如果我要创建一个继承SomeClass<SomeInterface>的项目集合,我会遇到完全相同的问题。

5个回答

4
如何从一个包含常见行为的类/接口中派生:
如何从一个包含通用行为的类或实现接口中派生:
interface IIsActive
{
    bool IsActive{get;}
}

那将是解决这里问题的好方法,为此点赞。但我主要是在一般情况下询问引用泛型类的方式。 - Ingó Vals

3

使用接口来实现通用类:

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;
}

所以我的假设是正确的,正如你和Dan Tao所提到的那样。因此,基本上我会让接口拥有所有独立于T的类成员,而所有依赖于T的内容则在泛型版本中。 - Ingó Vals

2
我们应该创建一个名为SomeClass的类,它继承自SomeInterface,在这个类中定义IsActive属性。是的,这正是你应该做的(通常就是这样做的)。
或者,您可以按照spender的建议使用接口而不是抽象类。这可能更好,因为它可以在不限制您的刚性类型层次结构的情况下实现相同的目标。

0

使用接口而不是类实现

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;
    }
}

1
那行不通... 该项是 SomeClass<SomeInterface>,而不是 SomeInterface。 - Marino Šimić

0

我不确定我是否理解正确,但是这个方法签名对于SomeMethod是否有效?

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

1
第二个代码块将无法工作:InvalidCastException “无法将类型为'ConcreteType'的对象转换为类型'SomeClass`1 [SomeInterface]'。” - Jacob Krall
@Jacob:好的,没问题 - 没有实现之前我也不确定。已经将其删除了。 - Jon Egerton
SomeMethod 可能是某个抽象类的重写方法,我无法控制该类的配置文件。例如,可能是 SortingMethod,但我知道被排序的集合是 SomeClass 类型的。 - Ingó Vals

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接