假设我有一个方法,我希望返回类型与类相同。例如Cat:Marry(Cat y)
或Dog:Marry(Dog y)
但我不想让猫嫁给狗!
是否有一种编程语言可以让我表达这一点,并且如果你试图嫁给一只猫和狗,会给出一个编译时错误? e.g。
class Animal{
void Marry(Animal X){
Console.Write(this+" has married "+X);
}
}
class Cat:Animal{}
class Dog:Animal{}
因此,我希望允许(new Cat()).Marry(new Cat())
,但不允许(new Cat()).Marry(new Dog())
换句话说,我希望Marry的参数类型与其类相匹配。有没有语言可以这样做? (不必编写多个Marry函数?)我正在设想这样的东西:
void Marry(caller X){
Console.Write(this+" has married "+X);
}
答案 0 :(得分:1)
您可以使用泛型在Java中执行此操作:
public class Test {
public static void main(String[] args) {
final Dog dog = new Dog();
final Cat cat = new Cat();
cat.marry(cat);
dog.marry(dog);
}
}
class Animal <T extends Animal> {
void marry(T other) {
}
}
class Dog extends Animal<Dog> {
}
class Cat extends Animal<Cat> {
}
这里有一大堆我在Java 8中正常工作的代码,对于那些想要更具体答案的人来说:
{{1}}
答案 1 :(得分:1)
您可以使用CRTP:
在C ++中实现此目的template <typename Derived>
class Animal{
void Marry(Derived X)
{
//code here
}
}
class Dog : Animal<Dog>
{
}
class Cat : Animal<Cat>
{
}