D: Как переопределить инвариантный метод в расширенном классе? - PullRequest
1 голос
/ 19 января 2020

Я пытаюсь создать пример нарушения принципа Лискова для изучения:

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 имеет два утверждения и не только один переопределенный

Итак, как переопределить инвариантный метод в расширенном классе?

1 Ответ

3 голосов
/ 19 января 2020

Ты не. Эти языковые функции предназначены для обеспечения соблюдения принципов Лискова, а не их нарушения. Инварианты должны всегда сохраняться, даже в дочерних классах. (см. https://en.wikipedia.org/wiki/Class_invariant)

Если вы хотите преднамеренно обманывать в демонстрационных целях, вы можете написать другой метод и вызвать его вручную, но ключевое слово invariant вам не поможет нарушать правила ...

...