D: 如何覆盖扩展class中的不变方法?

D: How to override the invariant method in a extended class?

我正在尝试创建一个Liskov 原则违反 示例用于学习目的:

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");
}

但是我无法覆盖 MalvadaPessoa 上的不变量 class,我遇到了这个错误:

main.d(25): Error: function main.MalvadaPessoa.__invariant2 cannot override a non-virtual function

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

那么,如何在扩展中覆盖不变方法class?

你不知道。这些语言特性旨在强制执行 liskov 原则,而不是违反它们。不变量必须始终成立,即使在 child 类 中也是如此。 (参见 https://en.wikipedia.org/wiki/Class_invariant

如果你为了演示目的故意作弊,你可以写一些其他方法并手动调用它,但是invariant关键字不会帮助你破坏规则...