Cuando anulo las funciones en D con contratos "en", se verifican los contratos heredados "en". Si fallan, se verifican los contratos "en" anulados. Si no especifico ninguno en el contrato, se interpreta como si hubiera un contrato "in" vacío. Entonces el siguiente código se compila y se ejecuta con éxito.¿Cómo puedo usar de manera significativa los contratos de precondición en las interfaces D?
module main;
import std.stdio;
interface I
{
void write(int i)
in
{
assert(i > 0);
}
}
class C : I
{
void write(int i)
{
writeln(i);
}
}
int main()
{
I i = new C;
i.write(-5);
getchar();
return 0;
}
que sólo quieren la condición previa de I.write()
comprobación cuando llamo i.write()
ya que eso es lo que se conoce de forma estática a ser suficiente para I.write()
para funcionar correctamente por el compilador. Comprobando todas las condiciones previas después de el envío dinámico me parece extraño desde una perspectiva OO ya que se pierde la encapsulación.
Podría repetir la precondición o escribir in { assert(false); }
en todas las clases implementando la interfaz, pero eso es un problema. ¿Es eso un error de diseño en el lenguaje D? ¿O hay alguna forma adecuada y escalable de hacerlo?
No estoy seguro de si la página de documentación no está desactualizada. Tendría que mirar TDPL para estar seguro, pero hay un error similar al problema del OP: http://d.puremagic.com/issues/show_bug.cgi?id=6549 – jpf
@jpf Esa es una solicitud de mejora. Algunas personas quieren que se modifique el idioma con respecto a este tema. La documentación es correcta con respecto al comportamiento actual. –
Oh cierto, no me di cuenta de eso. – jpf