일반 클래스가 있습니다. 그리고이 제네릭 클래스에는 멤버 중 하나와 동일한 클래스의 다른 인스턴스가 있어야합니다.
기본적으로 일련의 작업을 수행하려고합니다. 따라서 모든 클래스는 작업을 계속하기 위해 다음 항목을 알아야합니다.
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 ++.
LinkedList<ChainedItem<>>
하지만 다이아몬드 연산자를 사용할 수 있으므로 C #에서는 진정한 일반 다형성을 사용할 수 없습니다.
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] 삭제
몇 마디 만하겠습니다