作为一名 C++ 背景的人,我遇到过以下情况:
鉴于 c# 不支持 typedef,如何以编程方式关联类型。也就是说,在 C++ 中,我可以将相关类型存储为 typedef,以便在与模板一起使用时进行检索。在 C# 中无法以同样的方式完成同样的事情,因为缺乏typedef
.
例如在 C++ 中我会:
template< typename T >
class Thing : public ThingBase<T>
{
public:
bool isRelated( T::Parent & otherThing )
{
T::Auxillary aux( "Yes" );
return aux.isValid( otherThing ) && data.isParent( otherThing );
}
private:
T data;
};
这适用于以下任一情况:
class SomeClass
{
public:
typedef SomeClassParent Parent;
typedef FooAuxillary Auxillary;
bool isParent( Parent & parentObject );
};
class OtherClass
{
public:
typedef OtherClassParent Parent;
typedef BarAuxillary Auxillary;
bool isParent( Parent & parentObject );
};
虽然能够打电话T::isParent
参数类型可以通过通用接口来实现,构建签名Thing::isRelated
似乎没有 typedefs 是不可能的。
那么,在 C# 中,我该如何获取 T 的相关接口类型(在 C++ 示例中为 T::Interface)?
您需要使用通用约束(可能在本例中)第二个通用参数作为 SLAks,如所示。
interface IRelated<TRelated>
{
bool isParent(TRelated parentObject);
}
class SomeClassParent {}
class SomeClass : IRelated<SomeClassParent>
{
bool isParent(SomeClassParent parentObject)
{
// your logic here
return true;
}
}
class Thing<T, TParent> : ThingBase<T> where T : IRelated<TParent> {}
To use:
var obj = new Thing<SomeClass, SomeClassParent>();
这是另一种选择。这需要一些运行时类型检查(并允许使用任何类型的对象调用 isParent),但它清理了语法。
interface IRelated
{
bool isParent<T>(T parentObject);
}
class SomeClassParent {}
class SomeClass : IRelated
{
bool isParent<T>(T parentObject)
{
if (parentObject is SomeClassParent)
{
// your logic here
return true;
}
}
}
class Thing<T> : ThingBase<T> where T : IRelated {}
To use:
var obj = new Thing<SomeClass>();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)