D 인터페이스에서 전제 조건 계약을 어떻게 사용하려면 어떻게합니까?

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

  •  12-12-2019
  •  | 
  •  

문제

"in"계약으로 D로 함수를 무시하면 상속 된 "in"계약이 체크됩니다.실패하면 "is in"계약이 선택됩니다.계약서를 지정하지 않으면 "비어있는"계약이있는 것처럼 해석됩니다.따라서 다음 코드가 컴파일되고 성공적으로 실행됩니다.

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()를 통화하는 경우 I.write()의 전제 조건을 확인하기 만하면됩니다. 이후의 모든 전제 조건을 확인하십시오. 동적 파견은 캡슐화가 손실 된 이후로 OO 관점에서 홀수로 나를 괴롭 힙니다.

인터페이스를 구현하는 모든 클래스에서 Preconditation을 반복하거나 in { assert( false ); }를 작성할 수 있지만 그것은 고통입니다.D 언어의 디자인 오류입니까?아니면 그 일을 할 수있는 적절한 확장 가능한 방법이 있습니까?

도움이 되었습니까?

해결책

http://dlang.org/dbc.html

파생 클래스의 함수가 수퍼 클래스의 함수를 무시하면 함수의 계약 및 해당 기본 기능 중 하나만 만족해야합니다. 그런 다음 무시 무시한 함수는 계약을 느슨하게하는 과정이됩니다.

계약이없는 기능은 함수 매개 변수의 값이 허용되지 않는다는 것을 의미합니다. 이는 상속 계층 구조의 함수가 계약이없는 경우, 오버라이드 함수의 계약에서 유용한 효과가 없음을 의미합니다. 반대로, 모든 아웃 된 계약을 모두 만족해야하므로 무시하는 기능은 아웃 계약을 강화하는 프로세스가됩니다.

다형성 행동이 문제가 될 때 실제로 어려운 디자인 퍼즐입니다. 예를 들어, 관련 긴 토론의이 버그 보고서를보십시오 : http : // d .puremagic.com / 이슈 / show_bug.cgi? ID= 6857

Queyworking Degverse를 달성하는 방법에 관해서는 믹스가 복사 - 붙여 넣기를 방지 할 때 항상 작동하지만 계약 패러다임의 디자인 지점에서 괜찮은지 모르겠습니다. 불행히도이 질문 조언에 이론적으로 이론적으로 유능한 누군가가 필요합니다.

다른 팁

D의 전제 조건은 기능이 올바르게 실행되는 요구 사항입니다.기능을 오버로드하는 경우 새 코드를 작성하는 경우 이전 코드의 요구 사항은 반드시 새 코드에 대한 요구 사항이 아닙니다.

이 문제는 인터페이스에 대해 직접 논의하지는 않지만 http : //d.puremagic.com/issues/show_bug.cgi?id=6856

이것은 어려운 일이 될 수 있습니다.하지만 Walter는 깨지지 않는 변화가 없을 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top