Saya mencoba untuk menulis algoritma umum dalam C # yang dapat bekerja dengan entitas geometris dari dimensi yang berbeda.
Dalam contoh berikut yang saya buat Point2
dan Point3
, keduanya mengimplementasikan IPoint
antarmuka sederhana .
Sekarang saya memiliki fungsi GenericAlgorithm
yang memanggil fungsi GetDim
. Ada beberapa definisi fungsi ini berdasarkan jenisnya. Ada juga fungsi mundur yang didefinisikan untuk apa pun yang mengimplementasikan IPoint
.
Saya awalnya mengharapkan output dari program berikut ini menjadi 2, 3. Namun, itu adalah 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 !!
}
}
OK, jadi karena alasan tertentu informasi tipe konkret hilang GenericAlgorithm
. Saya tidak sepenuhnya mengerti mengapa ini terjadi, tetapi baik-baik saja. Jika saya tidak dapat melakukannya dengan cara ini, alternatif apa lagi yang saya miliki?
GetDim
(yaitu saya melewati Point4
tetapi GetDim<Point4>
tidak ada). Namun, tampaknya kompiler tidak peduli untuk mencari implementasi khusus.
NumDims
properti tersedia. Mengapa Anda mengabaikannya dalam beberapa kasus?