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

本文关键字:实例 泛型类 何引用 引用 | 更新日期: 2023-09-27 18:02:05

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

假设我有一个泛型类:

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>的项目集合.

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

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

interface IIsActive
{
    bool IsActive{get;}
}

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

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

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

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

或者你可以遵循spender的建议,使用接口而不是抽象类。这可能更好,因为它实现了相同的目标,而不会将您限制为严格的类型层次结构。

使用接口而不是类实现

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

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

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