Delphi 객체 지향 방법

3733 단어 Delphi
방법은 대상을 정하는 과정과 함수에 속하고 방법은 대상의 행위를 반영하는 것이지 데이터가 아니다. 앞에서 언급한 대상의 두 가지 중요한 방법: 구조 방법과 분석 방법이다.
대상이 각종 기능을 수행할 수 있도록 하기 위해서, 너는 대상에서 맞춤형 방법을 만들 수 있다
하나의 방법을 만드는 데는 두 가지 절차가 있으며, 먼저 대상 형식의 성명에서 이 방법을 설명합니다.그리고 코드 정의 방법으로다음 코드는 방법을 설명하고 정의하는 절차를 보여 준다
type

    TBoogieNights = class

        Dance: Boolean;

        Procedure DoTheHustle;

    end;



procedure TBoogieNights.DoTheHustle;

begin

    Dance:= True;

end;


참고: 메서드를 정의할 때는 메서드 DoTheHustle을 정의할 때처럼 전체 이름을 사용해야 합니다.또한 이 방법에서 대상의 댄스 필드가 직접 접근할 수 있음을 주의해야 한다
 
방법의 유형
대상의 방법은 정적 (static), 가상 (virtual), 동적 (dynamic), 메시지 처리 (message) 로 정의할 수 있습니다.아래의 예를 보십시오
TFoo = class

    procedure IAmAStatic;

    procedure IAmAVirtual; virtual;

    procedure IAmADynamic; dynamic;

    procedure IAmAMessage(var m: TMessage); message wm_SomeMessage;

end;


1) 정적 방법
IAMAStatic은 정적 방법입니다. 정적 방법은 방법의 부족한 유형입니다. 일반적인 과정과 함수처럼 호출됩니다.컴파일러는 이 방법의 주소를 알고 있기 때문에 정적 방법을 호출할 때 실행 가능한 파일에 정보를 정적 으로 연결할 수 있다.정적 방법이 가장 빨리 실행되지만, 다중성을 지원하기 위해 덮어쓸 수 없습니다
2) 가상 방법
IAMAVirtual은 가상 방법입니다.가상 방법과 정적 방법의 호출 방식은 같다.가상 방법이 덮어쓸 수 있기 때문에 코드에서 지정한 가상 방법을 호출할 때 컴파일러는 주소를 모른다.따라서 컴파일러는 가상 메소드 테이블(VMT)을 만들어 런타임 시 함수 주소를 찾습니다.모든 가상 방법은 실행할 때 VMT를 통해 스케줄링된다. 한 대상의 VMT 표에는 자신이 정의한 가상 방법 외에 그의 조상들의 모든 가상 방법이 있기 때문에 가상 방법은 동적 방법보다 메모리를 많이 사용하지만 비교적 빨리 실행된다.
3) 동적 방법
IAMADynamic는 동적 방법으로 동적 방법은 가상 방법과 기본적으로 비슷하지만 그들의 스케줄링 시스템이 다르다.컴파일러는 모든 동적 방법에 유일한 숫자를 지정하고 이 숫자와 동적 방법의 주소로 동적 방법표 (DMT) 를 구성합니다.VMT표와 달리 DMT표에는 동적 방법만 있고 이 방법은 조상의 DMT표에서 다른 동적 방법에 접근해야 한다.그렇기 때문에 동적 방법은 가상 방법보다 메모리가 적지만 실행이 느리다. 왜냐하면 조상 대상의 DMT에서 동적 방법을 찾아야 하기 때문이다.
4) 메시지 처리 방법
IAMAMessage는 메시지 처리 방법입니다. 키워드 메시지 뒤에 있는 값은 이 방법이 응답할 메시지를 표시합니다.Windows 메시지를 직접 호출하지 않고도 메시지 처리 방법으로 응답할 수 있습니다.
 
보충: 키워드 Class
하나의 클래스 방법 앞에 키워드class를 추가하면 방법이 다른 일반적인 과정과 함수처럼 호출되고 이 방법을 포장한 클래스의 실례를 만들 필요가 없다. 이 기능은 C++의Static 함수에서 참고한 것이다.
조심해야 한다: 어떤 실례 정보에 의존하지 않도록 해야 한다. 그렇지 않으면 컴파일할 때 오류가 발생할 수 있다
  
2. 방법의 덮어쓰기
Delphi에서 OOP의 낙태적 개념을 실현하는 방법을 덮어씁니다.덮어쓰기를 통해 하나의 방법이 서로 다른 파생류 사이에서 서로 다른 행위를 나타낼 수 있다.Delphi에서 덮어쓸 수 있는 방법은 설명할 때virtual 또는dynamic로 표시되는 방법입니다.한 방법을 덮어쓰기 위해서 파생 클래스의 성명에서 가상 또는dynamic 대신 오버라이드를 사용합니다. 예를 들어 다음 코드로 IAMAVirtual과 IAMADynamic 방법을 덮어씁니다.
TFooChild = class(TFoo)

    procedure IAmAVirtual; override;

    procedure IAmADynamic; override;

    procedure IAmAMessage(var M: TMessage); message wm_SomeMessage;

end;


오버라이드 키워드를 사용하면 컴파일러는 VMT의 원래 방법을 새로운 방법으로 대체합니다.
주의: 오버라이드 대신 가상 또는dynamic로 IAMAVirtual과 IAMADynamic를 재성명하면 조상들을 덮어쓰는 것이 아니라 새로운 방법을 만들 수 있습니다.
마찬가지로 파생류에서 정적 방법을 덮어쓰려고 하면 새로운 대상의 방법은 조상류의 동명 방법으로 완전히 바뀐다.
 
방법의 중재
일반적인 과정과 함수처럼 방법도 재부팅을 지원하기 때문에 한 클래스에 같은 이름의 방법이 서로 다른 매개 변수표를 가지고 있다. 재부팅할 수 있는 방법은 반드시 오버로드 표시부호를 사용하여 표시해야 한다. 첫 번째 방법은 오버로드를 사용하지 않아도 된다. 다음 코드는 한 클래스에 세 가지 재부팅 방법이 있음을 보여준다.
type

    TSomeClass = class

        procedure AMethod(I: Integer); overload;

        procedure AMethod(S: String); overload;

        procedure AMethod(D: Double); overload;

    end;


  
4. 방법 명칭 재도입
때때로 파생류에 방법을 추가해야 하는데, 이 방법의 명칭은 조상류 중의 어떤 방법의 명칭과 같다.이런 상황에서 파생류에서 이 방법을 다시 설명하기만 하면 이 방법을 덮어쓸 필요가 없다.그러나 컴파일링을 할 때 컴파일러는 파생류의 방법이 조상류의 동명을 숨길 수 있다는 경고를 보낸다.이 문제를 해결하려면 파생 클래스에서reintroduce 지시자를 사용할 수 있습니다. 다음 코드는reintroduce 지시자의 정확한 사용법을 보여 줍니다.
type

    TSomeBase = class

        procedure Cooper;

    end;

    

    TSomeClass = class(TSomeBase)

        procedure Cooper; reintroduce;

    end;


  
5.Self
모든 객체의 방법에는 억제된 변수가 있는데 이를 Self라고 합니다. Self는 방법을 호출하는 데 사용되는 클래스 인스턴스에 대한 포인터입니다.
Self는 컴파일러가 억제된 매개 변수로 방법에 전달합니다

좋은 웹페이지 즐겨찾기