代码之家  ›  专栏  ›  技术社区  ›  John V

逆变和协方差是否也意味着使用相同的类型?

  •  1
  • John V  · 技术社区  · 6 年前

    我很困惑。我偶然发现了签名规则(B.Liskov在她的作品中也提到过),其中规定:

    m1级 平方米 拥有相同数量的 论据。如果参数类型的列表 m1级 ,以及 b ,然后我。 b 是的子类型 b .

    另一教材:

    DXCX,我们 必须 参数类型!

    如果我只使用相同类型的参数和返回类型,这是否意味着我永远不会进行正确的子类型划分?我不明白使用同一类型是否也算数,也就是说,当我对父类和子类方法参数都使用同一类型时,这是反变的吗?

    class Person
    {
    }
    class Employee: Person
    {
    }
    
    class PersonRegister
    {
       GetJobTitle(Employee e) {return e.JobTitle;}
    }
    
    class DeriverRegister: PersonRegister
    {
      GetJobTitle(Person p)  //contravariance, using less derived type, cannot be done in C#
    }
    

    1 回复  |  直到 6 年前
        1
  •  0
  •   Damien_The_Unbeliever    6 年前
    class Person
    {
    }
    class Employee: Person
    {
    }
    
    class PersonRegister
    {
       GetJobTitle(Employee e) {return e.JobTitle;}
    }
    
    class DeriverRegister: PersonRegister
    {
      GetJobTitle(Person p)  //contravariance, using less derived type, cannot be done in C#
    }
    

    你说得对。如果你愿意的话 GetJobTitle 在里面 DervierRegister 被认为是 override 属于 PersonRegister ,必须使用 允许 要按编写的方式创建此方法,但 阴影 那个来自 人事登记簿 也不被认为是一种超越。所以你可以写上面的,但是

    var e = new Employee();
    PersonRegister pr = new DervierRegister();
    pr.GetJobTitle(e);
    

    将从调用方法 .

    这是否意味着我的代码从来都不符合LSP?

    在某种程度上你不能使用协方差和逆变 ,是的。但是,对于通用 interfaces and delegates ,在C#4.0中添加了支持。而且,如前所述,当正式说话时,每一种类型都被认为是其自身的一种亚类型,所以短语如 是的子类型 .

    推荐文章