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

问题描述 投票:0回答:1

我正在尝试创建一个违反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类上的不变式,我遇到了这个错误:

main.d(25):错误:函数main.MalvadaPessoa .__ invariant2无法覆盖非虚函数

[并且没有替代,MalvadaPessoa有两个断言,而不仅仅是一个被推翻

所以,如何在扩展类中覆盖不变方法?

oop overriding d invariants
1个回答
0
投票

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

如果您出于演示目的故意作弊,可以编写其他方法并手动调用它,但是invariant关键字不会帮助您违反规则...

© www.soinside.com 2019 - 2024. All rights reserved.