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
关键字不会帮助你破坏规则...
我正在尝试创建一个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
关键字不会帮助你破坏规则...