【发布时间】:2017-09-26 00:49:26
【问题描述】:
我想设计一些东西,让两件事之间的距离。然而,这些东西可能以许多令人讨厌的形式表现出来。
假设我们有一组类。 (不一定是基础和派生的) 猫,CoolCat,ReallyCoolCat
他们都有获得职位的方法。我想写一个函数调用'DistanceBetween'来获取猫之间的距离。
我可以重载:
public static float DistanceBetween(Cat cat1, Cat cat2)
{
return Mathf.Abs(cat1.position - cat2.position);
}
public static float DistanceBetween(CoolCat cat1, CoolCat cat2)
{
return Mathf.Abs(cat1.transform.position, cat2.transform.position);
}
// ... etc...
但是,在某些情况下,我需要知道 Cat 和 CoolCat 之间的距离或 CoolCat 和 RealCoolCat 之间的距离。这意味着……
public static float DistanceBetween(Cat cat1, CoolCat cat2)
{
return Mathf.Abs(cat1.position, cat2.transform.position);
}
public static float DistanceBetween(CoolCat cat1, ReallyCoolCat cat2)
{
return Math.Abs(cat1.tranform.position, cat2.kittyVariables.position);
}
// ... etc ...
但这似乎是任意的,因为我可以重新排列参数的顺序,而我的函数将不起作用。所以我必须...
public static float DistanceBetween(CoolCat cat1, Cat cat2)
{
return Mathf.Abs(cat1.tranform.position, cat1.position);
}
public static float DistanceBetween(ReallyCoolCat cat1, CoolCat cat2)
{
return Math.Abs(cat1.kittyVariables.position, cat2.transform.position);
}
// ... etc ...
所以这意味着我制作的每只可爱小猫的代码量增加了 n^2。由于我想制作多少可爱的小猫,这种代码增长量是不可接受的。我无法实现继承,因为我可爱的小猫(虽然名字相似)具有非常不同的功能并且是独一无二的。 (我也可以添加小狗等。)所以我想的是创建一个接口“IDistanceable”,表示实现类有一个“位置”属性并在每个小猫中实现它。但这似乎有点过头了,我想要的只是可以重新排列我的论点并使 Func(a,b) 等于 Func(b,a)...
我真的不知道该怎么办...这两种解决方案(编写 500 个函数或制作界面和大量垃圾)似乎都错了。
由于无法修改一些可爱的小猫类,界面将无法正常工作...
请帮助我和我可爱的小猫!谢谢!
【问题讨论】:
-
如果他们都有办法访问某个职位,请创建一个名为
IPositioned的接口并让他们实现它。那么你只需要一个GetDistance函数,它需要 2 个IPositioned对象。这正是接口的用途。 -
我正在考虑使用“IDistanceable”界面类似的东西......但现在我意识到了一些事情。一些可爱的小猫是我无法修改的类。
-
绝对最坏的情况,让
GetDistance函数接受2 个对象,并使用反射来查找Position属性。如果“位置”函数在某些类中的命名不同,您可能需要使用特殊逻辑来找到正确的函数。也可以使用dynamic对象。 -
然后你可以为那些你不能修改的类做一个重载,其余的使用一个接口。所有这些类都共享一些基类吗?
-
听起来很难。但是有没有办法让 Func(a,b) 等于 Func(b,a) 以便代码的增长可以从 n^2 减少到第 n 个三角形数
标签: c# casting overloading