我还没有完全围绕仿制药的一个方面。
假设我有一个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>
的项目集合。
答案 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;
}