我有一个通用类。并且该通用类需要与其成员之一具有相同类的另一个实例。
基本上,我正在尝试实现一系列操作。因此,每个班级都必须知道下一项才能继续操作。
ChainedItem(Uri)-> ChainedItem(String)-> ChainedItem(MyClass)-> ....
到目前为止,这是我尝试过的。
public abstract class ChainedItem<T>
{
private ChainedItem<R> m_chainedItem;
public void SetNextChainedItem(ChainedItem<R> chainedItem)
{
m_chainedItem = chainedItem;
}
public abstract void DoOperation(T data);
public virtual void ContinueNextOperation<R>(R data)
{
if(m_chainedItem != null)
m_chainedItem.DoOperation(data);
}
}
但是我不能这样使用它,因为R
第3行中尚未定义。
实际上这是不可能的,因为编译器不支持它,否则将导致编译器的堆栈溢出,这是无休止的,因此是不可能的,因为.NET规范当前定义的通用类型验证比模板中的模板更严格。 C ++。
您可以使用aLinkedList<ChainedItem<>>
但菱形运算符,因此C#中不提供真正的通用多态性:
因此,也许您可以使用接口和类型检查(不包括空值)来编写此类代码:
public interface IChainedItem
{
void DoOperation(object value);
}
public abstract class ChainedItem<T> : IChainedItem
{
private IChainedItem m_chainedItem;
public void SetNextChainedItem(IChainedItem chainedItem)
{
m_chainedItem = chainedItem;
}
public abstract void DoOperation(T data);
public virtual void ContinueNextOperation(object data)
{
if ( m_chainedItem != null )
m_chainedItem.DoOperation(data);
}
public void DoOperation(object value)
{
if ( value == null )
throw new ArgumentNullException();
var typeIn = value.GetType();
var typeRequired = typeof(T);
if ( typeIn != typeRequired )
{
string message = $"Bad type in ChainedItem.DoOperation(object): "
+ $"{typeRequired.Name} is required and not {typeIn.Name}.";
throw new ArgumentException(message);
}
DoOperation((T)value);
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句