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

时间:2011-07-12 16:24:57

标签: c# generics inheritance abstract-class

我还没有完全围绕仿制药的一个方面。

假设我有一个Generic类:

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

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

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

现在稍后我将一个对象放入一个我知道类型为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 个答案:

答案 0 :(得分:4)

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

interface IIsActive
{
    bool IsActive{get;}
}

答案 1 :(得分: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;
}

答案 2 :(得分:2)

  

我们是否应该创建一个名为SomeClass的{​​{1}}的类   继承自该类,并在该类中定义SomeClass<SomeInterface>属性。

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

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

答案 3 :(得分: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;
    }
}

答案 4 :(得分:0)

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

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