다른 차원의 기하학적 엔터티와 함께 작동 할 수있는 일반 알고리즘을 C #으로 작성하려고합니다.
다음 인위적인 예제에서는 Point2
및 Point3
둘 다 간단한 IPoint
인터페이스를 구현합니다 .
이제 함수 GenericAlgorithm
를 호출하는 함수가 GetDim
있습니다. 유형에 따라이 함수에 대한 여러 정의가 있습니다. 를 구현하는 모든 것에 대해 정의 된 대체 함수도 있습니다 IPoint
.
처음에는 다음 프로그램의 출력이 2, 3이 될 것으로 예상했지만 0, 0입니다.
interface IPoint {
public int NumDims { get; }
}
public struct Point2 : IPoint {
public int NumDims => 2;
}
public struct Point3 : IPoint {
public int NumDims => 3;
}
class Program
{
static int GetDim<T>(T point) where T: IPoint => 0;
static int GetDim(Point2 point) => point.NumDims;
static int GetDim(Point3 point) => point.NumDims;
static int GenericAlgorithm<T>(T point) where T : IPoint => GetDim(point);
static void Main(string[] args)
{
Point2 p2;
Point3 p3;
int d1 = GenericAlgorithm(p2);
int d2 = GenericAlgorithm(p3);
Console.WriteLine("{0:d}", d1); // returns 0 !!
Console.WriteLine("{0:d}", d2); // returns 0 !!
}
}
GenericAlgorithm
좋습니다. 어떤 이유로 구체적인 유형 정보가 . 왜 이런 일이 발생하는지 완전히 이해하지 못하지만 괜찮습니다. 이런 식으로 할 수 없다면 다른 대안이 있습니까?
이 방법:
static int GenericAlgorithm<T>(T point) where T : IPoint => GetDim(point);
... 항상을 호출 GetDim<T>(T point)
합니다. 오버로드 해결은 컴파일 타임에 수행되며 해당 단계에는 다른 적용 가능한 방법이 없습니다.
실행 시간에 오버로드 해결을 호출 하려면 동적 타이핑을 사용해야합니다.
static int GenericAlgorithm<T>(T point) where T : IPoint => GetDim((dynamic) point);
그러나 일반적으로 이것을 위해 상속을 사용하는 것이 더 좋은 생각입니다. 예를 들어, 분명히 단일 메서드와 return을 가질 수 있습니다 point.NumDims
. 실제 코드에서 동등한 것이 더 까다로운 이유가 있다고 가정하지만 더 많은 컨텍스트가 없으면 상속을 사용하여 전문화를 수행하는 방법에 대해 조언 할 수 없습니다. 그래도 옵션은 다음과 같습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다