是否支持在Vala中混合使用参数和子类型多态与约束条件?

时间:2019-05-22 06:32:50

标签: inheritance vala parametric-polymorphism

我个人最喜欢的C#功能之一是能够混合参数和子类型多态性(泛型和继承)。但是我找不到任何有关Vala的文档,指出有可用的文档,也没有任何讨论表明此文档不可用或即将发布。谁能给我一个明确的答案,而有消息说它将来是否可用,或者将来可用吗?

举一个简短的例子说明我的意思,以防万一:

namespace Animals
{
    public interface Animal{
        void say_something();
    }

    public abstract class Canine : Animal{
        public void say_something(){
                stdout.printf("Woof!");
        }
    }

    public interface AnimalSpecialist<T> where T : Animal{
    }

    public interface DogSpecialist<T> : AnimalSpecialist<T> where T : Canine{
    }
}

1 个答案:

答案 0 :(得分:1)

进行一些小的更改,您的示例代码将使用valac编译。

namespace Animals
{
    public interface Animal {
        public abstract void say_something();
    }

    public abstract class Canine : Animal {
        public void say_something(){
                stdout.printf("Woof!");
        }
    }

    public interface AnimalSpecialist<T> {
    }

    public interface DogSpecialist<T> : AnimalSpecialist<T> {
    }
}

Vala不支持的一件事是类型参数约束(where T …)。

除了支持参数多态性和子类型多态性。

要牢记的一件事是,将Vala代码直接转换为C代码,因此您会注意到对参数多态性有一些限制,尤其是在使用具有非可空值类型的泛型时。

我无法评论方差(协方差和逆方差)及其处理方式。