超类可以返回一个子类吗?例如,结婚功能?

时间:2016-11-29 22:50:01

标签: inheritance polymorphism covariance

假设我有一个方法,我希望返回类型与类相同。例如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);
}

2 个答案:

答案 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>
{
}