如何引用泛型类的所有实例
本文关键字:实例 泛型类 何引用 引用 | 更新日期: 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;
}