이 기본 클래스에서 파생 된 클래스의 유형과 일치하는 멤버를 선언하려는 추상 기본 클래스가 있다고 가정합니다.파생 클래스의 유형 인 추상 기본 클래스의 멤버를 선언하는 방법이 있습니까?
public abstract class BaseClass
{
protected BaseClass parent;
}
public class DerivedClass1 : BaseClass
{
// parent could be of type DerivedClass2
}
public class DerivedClass2 : BaseClass
{
// parent could be of type DerivedClass1
}
각 파생 클래스에서 parent
필드 BaseClass
에서 파생 아무것도 할 수 있기 때문에이 작동하지 않습니다. DerivedClass1
의 parent
필드가 DerivedClass1
일 수 있는지 확인하고 싶습니다. 그래서 제네릭을 사용해야한다고 생각합니다.
public abstract class BaseClass<T> where T : BaseClass<T>
{
protected T parent;
}
이것은 혼란스럽고 순환적인 것처럼 보일 수 있지만 컴파일됩니다. 기본적으로 parent
은 BaseClass
에서 파생 된 T
유형이어야합니다. 그래서 지금 파생 클래스는 다음과 같이 할 수 있습니다
public class DerivedClass : BaseClass<DerivedClass>
{
// parent is of type DerivedClass
}
문제는 내가 시행해야한다는 유형 일치 내가 DerivedClass
를 선언 할 때 자신을.
public class DerivedClass1 : BaseClass<DerivedClass2>
{
// parent is of type DerivedClass2
}
합니까 C#을 기본에 선언 된 멤버의 유형이 파생 유형과 일치해야이 될 수 있도록이 일을하는 방법이있다 :이 같은 일을 누군가를 중지 아무것도?
나는이 ++ 질문을 물어 노력했다이 C와 유사하다 생각 : 내가 제대로 귀하의 요구 사항을 이해한다면 Abstract base class for derived classes with functions that have a return type of the derived class
CRTP라고합니다. – SLaks
상위 속성을 특정 형식으로 만들려면 해당 기본 형식이 상속되는 기본 클래스에 대해 걱정할 필요가있는 이유는 무엇입니까? 또한 추상 클래스에서이 속성을 선언 할 필요가 없습니다. 적절한 클래스에서 속성을 만들어야합니다. –
질문에 불확실한 점이 있습니다. 내 말은, 네가 원하는 것이 분명하다는거야. 하지만, C#이 그런 종류의 제약 조건을 제공하지 않는다는 것을 알았어 야합니다. 더 중요한 점은,이 제약이 유용하다고 생각하는 _why_와 관련된 제로 세부 사항을 제공한다는 것입니다. 'T' 형 매개 변수가 실제로 선언 형과 동일하지 않은 경우 왜 당신에게 중요합니까? 이것이 기본 클래스 또는 파생 클래스의 구현에 어떤 영향을 미칩니 까? 당신이 할 수 없었던 일, 당신이 그런 제약으로 할 수 있었던 것? 기대에 대한 자세한 내용을 입력하십시오. –