代码之家  ›  专栏  ›  技术社区  ›  celsowm

D: 如何重写扩展类中的不变方法?

  •  0
  • celsowm  · 技术社区  · 5 年前

    我试图创建一个 违反利斯科夫原则 用于学习目的的示例:

    import std.stdio;
    class Pessoa {
        string nome;
        string apelido;
        this(string nome, string apelido){
            this.nome = nome;
            this.apelido = apelido;
        } 
        invariant{
            assert(nome != apelido);
        }
    }
    class BoaPessoa : Pessoa {
        this(string nome, string apelido){
            super(nome, apelido);
        }
        string getNomeCompleto(){
            return this.nome ~"vulgo" ~ this.apelido;
        }
    }
    class MalvadaPessoa : Pessoa {
        this(string nome, string apelido){
            super(nome, apelido);
        }
        override invariant{
            assert(this.nome != "");
        }
    }
    void main(){
        BoaPessoa bp = new BoaPessoa("João","Joãozinho");
        MalvadaPessoa mp = new MalvadaPessoa("x", "Joãzinho");
    }
    

    但我无法覆盖MalvadaPassoa类上的不变量,我遇到了以下错误:

    main.d(25):错误:函数main。马尔瓦达佩索亚__不变量2不能 覆盖非虚拟函数

    在没有覆盖的情况下,MalvadaPassoa有两个断言,而不仅仅是一个被高估了

    那么,如何在扩展类中重写不变方法呢?

    1 回复  |  直到 5 年前
        1
  •  3
  •   Adam D. Ruppe    5 年前

    你不会的。这些语言功能旨在执行liskov原则,而不是违反它们。不变量必须始终成立,即使在子类中也是如此。(参见 https://en.wikipedia.org/wiki/Class_invariant )

    如果你想出于演示目的故意作弊,你可以编写一些其他方法并手动调用它,但 invariant 关键字不会帮助你打破规则。。。

    推荐文章