我正在尝试创建一个违反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有两个断言,而不仅仅是一个被推翻
所以,如何在扩展类中覆盖不变方法?
你不知道。这些语言功能旨在执行liskov原则,而不违反它们。即使在子类中,不变式也必须始终成立。 (请参见https://en.wikipedia.org/wiki/Class_invariant)
如果您出于演示目的故意作弊,可以编写其他方法并手动调用它,但是invariant
关键字不会帮助您违反规则...