Как я могу осмысленно использовать договоры о предварительных условиях в интерфейсах D?

StackOverflow https://stackoverflow.com//questions/11682991

  •  12-12-2019
  •  | 
  •  

Вопрос

Когда я переопределяю функции в 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;
}
.

Я хочу проверить только предварительное условие для проверки генеракодицетагкода, когда я звоню I.write(), поскольку это то, что статически известно, что для i.write() достаточно для правильной работы компилятора.Проверка всех предварительных условий после того, как динамическая динамическая динамическая отправка ударяет меня как нечетное из перспективы OO, поскольку инкапсуляция потеряна.

Я мог бы повторить предварительное условие или писать I.write() во всех классах, реализующих интерфейс, но это боль.Это ошибка дизайна на языке d?Или есть ли правильный масштабируемый способ сделать это?

Это было полезно?

Решение

http://dlang.org/dbc.html

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

Функция без в контракте означает, что любые значения параметров функций разрешены. Это подразумевает, что если какая-либо функция в иерархии наследования не имеет в договоре, то в договорах на функции, переопределенные, не имеют полезного эффекта.

И наоборот, все выделенные контракты должны быть удовлетворены, поэтому переопределенные функции становятся процессами затягивания контрактов вне договоров.

На самом деле это сложная конструкция головоломки, когда полиморфное поведение возникает на вопрос. Посмотрите, например, на этом отчете об ошибках с соответствующим долгом обсуждение: http:// d .PUREMAGIC.COM / выпуски / show_bug.cgi? ID= 6857

Что касается вопроса, как добиться желаемого поведения - миксин всегда работают, когда необходимо предотвратить копирование, но я не уверен, что это нормально, чтобы сделать это из точки дизайна по контракту Paradigm. К сожалению, нужно более теоретически компетентным в этом вопросе совет.

Другие советы

Предварительное условие в D - это требование функции для правильной работы.Если вы перегружете функцию, вы пишете новый код для него, старое предварительное условие - это требование для старого кода - не обязательно является обязательным требованием для нового кода.

Так этот вопрос, пока не обсуждается напрямую об интерфейсах, это href="http://d.puremagic.com/issues/show_bug.cgi?id=6856" rel="nofollow"> http://d.puremagic.com/issues/show_bug.cgi?id=6856

Это может быть трудно войти, чтобы Walter большой на нерешительных изменениях нет.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top