회사의 원래 시스템 코드에서, 나는 판별 객체의 클래스 이름 속성을 구별하는 많은 코드가 개별적으로 처리되는 것을 보았습니다. 그리고 비슷한 문제를 다루는 표준 방법 인 것 같습니다. 그러나 몇 가지 문제가있을 수 있습니다.
우선, 우리는 다형성이 객체 지향의 세 가지 주요 특징 중 하나라는 것을 알고 있습니다. 소위 다형성은 다른 콘크리트 유형의 경우 콘크리트 유형의 구현 세부 사항과 관련이없이 동일한 추상 인터페이스를 통해 액세스 할 수 있다는 것입니다. 통지 발행과 마찬가지로 : 모든 직원은 내일 9시에 People 's Square에 모입니다. 발행자에게 통지하는 사람의 책임이 아니라 특정 사람의 책임이기 때문에 설정해야 할 시간과 어떤 경로에 대해 다른 위치에 사는 각 사람에게 구체적으로 알릴 필요는 없습니다. 따라서 ClassName을 별도로 처리해야한다고 판단하기 위해 작성할 때 가장 먼저 생각하는 방법은 상위 클래스에 인터페이스를 추가하고 하위 클래스 재정의를 통해 완료하는 것입니다. 다음과 같이 그림의 크기를 변경하십시오.
i : = 0 to Graphic List.count -1 do
시작하다
그래픽 : = 그래픽 목록 [i];
그래픽. className = '사각형'이면
시작하다
사각형 (그래픽) .length : = 사각형 (그래픽) .length* 2;
사각형 (그래픽) .width : = 사각형 (그래픽) .width* 2;
끝
그렇지 않으면 graph.classname = 'circle'입니다
시작하다
원 (그래픽). 반경 : = 사각형 (그래픽);
끝
끝;
부모 클래스 "그래픽"에 "changesize"메소드를 추가 할 수 있습니다. 코드는 다음과 같습니다.
그래픽 = 클래스
...
절차 변경 (속도 : 정수);
끝;
사각형 = 클래스
...
절차 변경 (rate : Integer);
끝;
Circle = 클래스
...
절차 변경 (rate : Integer);
끝;
특정 그래픽 클래스에서 크기 변경을 구현하기위한 코드 :
절차 사각형 .Changesize (속도 : 정수);
시작하다
긴 : = 긴* 요금;
너비 : = 너비* 속도;
끝;
절차 원형 .Changesize (속도 : 정수);
시작하다
반경 : = 반지름* 속도;
끝;
이 방식을 수정 한 후 위의 코드를 다음과 같이 호출 할 수 있습니다.
i : = 0 to Graphic List.count -1 do
시작하다
그래픽 : = 그래픽 목록 [i];
그래픽 .Changesize (2);
끝;
이것은 코드를 더 명확하게 만듭니다.
물론 많은 경우에 클래스 이름을 판단 할 때 위의 솔루션을 사용할 수 없습니다. 예를 들어, Form의 공동 공동을 반복하고 다른 대조군에 대한 초기 시험을 수행합니다. 초기화 방법을 tcontrol에 추가하는 것은 불가능합니다. 특정 서브 클래스 유형을 구별하는 데만 사용할 수 있습니다. 그런 다음 클래스 이름을 직접 비교하는 대신 IS 연산자를 사용하는 것이 좋습니다.
IS의 사용법은 AOBJECT의 명령문은 다른 유형의 aobject에서 tform을 초래합니다.
aobject는 tobject이며 결과는 거짓입니다.
aobject는 tform이며 결과는 사실입니다.
aobject는 tform1이며 결과는 사실입니다.
aobject는 테디이며 결과는 거짓입니다.
aobject는 nil이고 결과는 거짓입니다.
위의 예에서는 IS를 사용하는 이점을 볼 수 있습니다. 앞으로 Tcooledit은 인터페이스를 아름답게하는 데 사용될 수 있으므로 Tcooledit이 테드 인 경우 하위 클래스의 이름으로 변경해야합니다.
둘째, 심판 된 객체가 비어있는 경우 클래스 이름을 사용하여 객체가 먼저 할당되었는지 여부를 결정하고 그렇지 않으면 메모리 액세스 오류가 발생합니다. 판단 담당자는 다음과 같이 작성해야합니다.
ClassName은 판결 오류가 있거나 사례 문제가있는 경우에 클래스의 속성을 설명하는 데만 사용되기 때문입니다. 논리 오류.이 오류는 실행 중에 진술이 실행될 때만 발견됩니다.
acontrol.classname = 'teidt'인 경우 //이 코드는 편집이 처음 테스트되지 않은 경우에만 확인됩니다.
Acontrol이 teidt 인 경우 // 컴파일 및 통과 할 수 없습니다.
위의 내용을 바탕으로, 먼저 특정 유형의 물체를 결정해야 할 때, 우리는 다형성 처리를 통해 이러한 특수 처리 진술을 피해야합니다. 클래스 이름보다.
매우 특별한 경우, Tedit과 Tcooledit을 별도로 처리 해야하는 경우와 같이 원하는 결과를 얻지 못할 수 있습니다. 유형 감지를위한 문자열 비교가없는 것보다 더 나을 것입니다.
Acooledit은 tedit // true입니다.
acooledit.classtype = tedit // false;
acooledit.classtype = tcooledit // true;