메소드
구조화된 유형의 데이터베이스 메소드는 입력 데이터 값 세트와 결과 값 세트 간의 관계이며, 여기서 첫 번째 입력 값(또는 주제 인수)에는 동일한 유형이 있거나 메소드의 주제 유형(주제 매개변수라고도 하는)의 부속 유형입니다.
예를 들어, 유형 ADDRESS의 CITY라는 메소드는 유형 VARCHAR의 입력 데이터 값에 전달할 수 있으며, 결과는 ADDRESS(또는 ADDRESS의 부속 유형)입니다.
사용자 정의 구조화된 유형의 정의 일부로 메소드가 내재적으로 또는 명시적으로 정의됩니다.
내재적으로 정의된 메소드가 모든 구조화된 유형에 대해 작성됩니다. 관찰자 메소드는 구조화된 유형의 각 속성에 대해 정의됩니다. 관찰자 메소드를 사용하여 애플리케이션이 유형의 인스턴스에 대한 속성의 값을 가져올 수 있습니다. Mutator 메소드는 각 속성에 대해서도 정의되어, 유형 인스턴스의 속성 값을 변경하여 애플리케이션이 유형 인스턴스를 변형할 수 있습니다. 이전에 설명된 CITY 메소드는 유형 ADDRESS의 mutator 메소드의 예입니다.
명시적으로 정의된 메소드 또는 사용자 정의 메소드는 CREATE TYPE(또는 ALTER TYPE ADD METHOD) 및 CREATE METHOD문의 조합을 사용하여 SYSCAT.ROUTINES에 데이터베이스로 등록되는 메소드입니다. 구조화된 유형에 정의된 모든 메소드가 유형과 동일한 스키마에 정의됩니다.
구조화된 유형의 사용자 정의 메소드는 데이터베이스 엔진에서 구조화된 유형 인스턴스에 적용될 수 있는 메소드 정의(사용자나 써드 파티 공급자에서 제공된)를 추가하여 데이터베이스 시스템의 함수를 확장합니다. 데이터베이스 메소드를 정의하면 애플리케이션이 사용하는 엔진에서 동일한 메소드를 사용할 수 있어 애플리케이션과 데이터베이스 사이에 더 많은 시너지를 제공합니다.
외부 및 SQL 사용자 정의 메소드
사용자 정의 메소드는 외부 또는 SQL 표현식을 기반으로 합니다. 외부 메소드는 메소드 호출 시 실행된 라이브러리 내 오브젝트 코드 라이브러리 및 함수에 대한 참조로 데이터베이스에 정의됩니다. 메소드 호출 시 SQL 표현식을 기반으로 하는 메소드가 SQL 표현식의 결과를 리턴합니다. SQL에서 완전히 작성되기 때문에 이러한 메소드는 오브젝트 코드 라이브러리가 필요하지 않습니다.
사용자 정의 메소드는 호출될 때마다 단일 값 응답을 리턴할 수 있습니다. 이 값은 구조화된 유형입니다. 메소드는 유형 유지로 정의되어(SELF AS RESULT 사용), 주제 인수의 동적 유형이 메소드의 리턴된 유형으로 리턴될 수 있습니다. 내재적으로 정의된 모든 mutator 메소드는 유형 유지됩니다.
메소드 서명
메소드는 주제 유형, 메소드 이름, 매개변수 수 및 매개변수의 데이터 유형으로 식별됩니다. 메소드 서명이라고 하며, 데이터베이스 내에서 고유해야 합니다.
- 매개변수의 수 또는 매개변수의 데이터 유형이 다르거나,
- 메소드는 동일한 메소드 계층 구조의 일부거나(즉, 메소드는 겹쳐쓰기 관계이거나 동일한 원래 메소드를 겹쳐씀),
- 동일 함수 시그니처(주제 유형 또는 부속 유형을 첫 번째 매개변수로 사용)가 존재하지 않습니다.
다중 메소드 인스턴스가 있는 메소드는 오버로드된 메소드라고 합니다. 메소드 이름은 유형 내 오버로드될 수 있으며, 이 경우 이 유형에 대해 해당 이름으로 메소드가 둘 이상 있습니다(다른 매개변수 유형이 있는 모든 유형). 메소드 이름은 주제 유형 계층 구조에 오버로드될 수도 있으며, 이 경우 유형 계층 구조에 해당 이름으로 둘 이상의 메소드가 있습니다. 이 메소드에는 다른 매개변수 유형이 있어야 합니다.
메소드 이름을 참조하여(허용 가능한 컨텍스트에서) 구조화된 유형 인스턴스(주제 인수) 및 이중 도트 연산자 모두보다 우선하여 메소드를 호출할 수 잇습니다. 괄호로 묶인 인수 목록이 다음에 와야 합니다. 실제 호출되는 메소드는 다음 섹션에서 설명된 메소드 분석 프로세스를 사용하여 주제 유형의 정적 유형에 종속됩니다. WITH FUNCTION ACCESS로 정의된 메소드는 함수 호출을 사용하여 호출될 수도 있으며, 이 경우 함수 분석을 위한 일반 규칙이 적용됩니다.
함수 분석 결과가 WITH FUNCTION ACCESS로 정의된 메소드이면, 메소드 호출의 모든 연속 단계가 처리됩니다.
메소드에 대한 액세스는 EXECUTE 특권을 통해 제어됩니다. GRANT 및 REVOKE문은 특정 메소드나 메소드 세트를 실행하거나 실행할 수 없는 사용자를 지정하는 데 사용됩니다. EXECUTE 특권(또는 DATAACCESS 권한)은 메소드를 호출하는 데 필요합니다. 메소드의 정의자는 EXECUTE 특권을 자동으로 수신합니다. 모든 기반 오브젝트에서 WITH GRANT 옵션이 있는 SQL 메소드나 외부 메소드의 정의자는 메소드에 대한 EXECUTE 특권과 함께 WITH GRANT 옵션도 수신합니다. 정의자(또는 ACCESSCTRL 또는 SECADM 권한이 있는 권한 부여 ID)는 SQL문에서 메소드를 호출하려는 사용자에게 권한 부여하거나, DDL문(CREATE VIEW, CREATE TRIGGER 또는 상수 정의 시와 같은)에서 메소드를 참조해야 합니다. EXECUTE 특권이 사용자에게 권한 부여되지 않은 경우, 더 나은 일치 항목이 있더라도 메소드는 메소드 분석 알고리즘에서 고려되지 않습니다.
메소드 분석
메소드 호출 후,
데이터베이스 관리자는 동일한 이름이 최적
인 메소드를 결정해야 합니다. 함수(내장
또는 사용자 정의)는 메소드 분석 중 고려되지 않습니다.
인수는 호출 시 메소드에 전달된 값입니다. 메소드가 SQL에서 호출되면, 주제 인수(일부 구조화된 유형의 인수) 및 0 이상의 인수 목록에 전달됩니다. 인수의 시맨틱이 인수 목록의 위치로 결정된 위치입니다. 매개변수는 메소드에 대한 입력의 형식 정의입니다. 메소드가 데이터베이스에 정의되면, 내재적으로(유형의 경우 시스템 정의) 또는 사용자(사용자 정의 메소드)에서 매개변수가 지정되며(첫 번째 매개변수로 주제 매개변수가 있는), 정의 순서는 위치 및 시맨틱을 정의합니다. 그러므로 모든 매개변수는 메소드에 대한 특정 위치 입력입니다. 호출 시 인수 목록에서의 위치때문에 인수는 특정 매개변수에 해당됩니다.
데이터베이스 관리자는 호출 시 제공된 메소드의 이름, 메소드에 대한 EXECUTE 특권, 인수의 수와 데이터 유형, 주제 인수의 특정 유형(및 해당 슈퍼 유형)과 동일한 이름의 모든 메소드 및 메소드의 선택 여부를 결정하기 위한 기준으로 해당 매개변수의 데이터 유형을 사용합니다. 다음은 의사결정 프로세스의 가능한 결과입니다.
- 특정 메소드는 최적이 될 것으로 간주됩니다. 예를 들어,
다음으로 정의된 시그니처가 있는 유형 SITE에 대해 RISK라는 이름의 메소드가 제공됩니다.
다음 메소드 호출(여기서 ST는 SITE 컬럼이며 DB는 DOUBLE 컬럼임),PROXIMITY(INTEGER) FOR SITE PROXIMITY(DOUBLE) FOR SITE
그리고 나서, 두 번째 PROXIMITY가 선택됩니다.SELECT ST..PROXIMITY(DB) ...다음 메소드 호출(여기서 SI는 SMALLINT 컬럼임),
SMALLINT가 INTEGER로 승격될 수 있으며 DOUBLE보다 더 나은 일치 항목이기 때문에 첫 번째 PROXIMITY를 선택하며, 우선순위 목록 아래 있습니다.SELECT ST..PROXIMITY(SI) ...구조화된 유형의 인수를 고려하면, 우선순위 목록은 인수의 정적 유형의 슈퍼 유형을 포함합니다. 최적은 함수 인수의 정적 유형보다 구조화된 유형 계층 구조에 가장 근접한 슈퍼 유형 매개변수로 정의된 함수입니다.
- 적합하게 맞다고 간주되는 메소드가 없습니다. 예를 들어,
이전 경우에서 동일한 두 함수 및 다음 함수 참조가 제공됩니다(여기서
C는 CHAR(5) 컬럼임).
인수는 PROXIMITY 함수 모두의 매개변수와 불일치합니다.SELECT ST..PROXIMITY(C) ... - 특정 메소드는 호출 시 전달된 인수의 데이터 유형과 수 및 유형 계층 구조의 메소드를 기반으로
선택됩니다. 예를 들어, 다음과 같은 시그니처가 정의된 유형 SITE
및 DRILLSITE(SITE의 부속 유형)에 대해 RISK라는 메소드가 지정됩니다.
및 다음 메소드 호출(여기서 DRST는 DRILLSITE 컬럼이며, DB는 DOUBLE 컬럼임),RISK(INTEGER) FOR DRILLSITE RISK(DOUBLE) FOR SITE
DRILLSITE가 SITE로 승격될 수 있기 때문에 두 번째 RISK가 선택됩니다.SELECT DRST..RISK(DB) ...다음 메소드 참조(여기서 SI는 SMALLINT 컬럼임):
SMALLINT는 INTEGER로 승격될 수 있기 때문에 첫 번째 RISK를 선택하며, DOUBLE보다 우선순위 목록에서 근접하며 DRILLSITE는 슈퍼 유형인 SITE보다 더 나은 일치 항목입니다.SELECT DRST..RISK(SI) ...동일한 유형 계층 구조 내 메소드에는 동일한 시그니처가 있을 수 없으며, 주제 매개변수가 아닌 매개변수를 고려합니다.
최적 판별
인수의 데이터 유형과 고려 중인 메소드의 매개변수의 정의된 데이터 유형을 비교하여
유사 이름의 메소드 그룹의 메소드가 최적
인 결정을 기반으로 형성됩니다. 고려 중인 메소드 결과의 데이터 유형은
이 결정에 포함되지 않습니다.
메소드 분석의 경우, 최적을 판단할 때 입력 인수의 데이터 유형이 해당 매개변수의 데이터 유형으로 승격될 수 있는지 여부가 고려됩니다. 함수 분석과는 달리, 최적을 판단할 때 입력 인수가 해당 매개변수의 데이터 유형에 내재적으로 캐스될 수 있는지 여부는 고려되지 않습니다. 메소드를 모듈에서 정의할 수 없기 때문에 메소드 분석 중 모듈이 고려되지 않습니다.
메소드 분석은 다음 단계를 사용하여 수행됩니다.
- 먼저 다음 모두가 참이 되도록 카탈로그(SYSCAT.ROUTINES)에서 모든 메소드를 찾습니다.
- 메소드 이름은 호출 이름과 일치하며 주제 매개변수는 같은 유형이거나 주제 인수의 정적 유형의 슈퍼 유형입니다.
- 호출자에는 메소드에 대한 EXECUTE 특권이 있습니다.
- 정의된 매개변수의 수는 호출과 일치합니다.
- 각 호출 인수는 데이터 유형에서 정의된 메소드의 해당 매개변수와 일치하거나
승격 가능
합니다.
- 다음으로, 왼쪽에서 오른쪽으로 메소드 호출의 각 인수를 고려합니다. 맨 왼쪽 인수(및 첫 번째 인수)는
내재된 SELF 매개변수입니다. 예를 들어, 유형 ADDRESS_T에 정의된 메소드에는
유형 ADDRESS_T의 내재된 첫 번째 매개변수가 있습니다. 각 인수의 경우,
해당 인수에 가장 일치하는 함수가 아닌 모든 함수를 제거합니다.
지정된 인수에 대해 가장 일치하는 데이터 유형은 해당 데이터 유형의 매개변수와 함께
함수가 존재하는 인수 데이터 유형에 해당되는 우선 순위 목록에 표시되는 첫 번째
데이터 유형입니다.
길이, 정밀도, 스케일 및 FOR BIT DATA 속성은 이 비교에서 고려되지
않습니다. 예를 들어, DECIMAL(9,1) 인수는
DECIMAL(6,5) 매개변수의 완전 일치로 간주되며, DECFLOAT(34) 인수는
DECFLOAT(16) 매개변수의 완전 일치로 간주되며,
VARCHAR(19) 인수는 VARCHAR(6) 매개변수의 완전 일치입니다.
사용자 정의 구조화된 유형 인수의 가장 일치하는 항목은 그 자체입니다. 다음으로 인수의 각 슈퍼 유형에 가장 일치하는 항목은 바로 위의 슈퍼 유형입니다. 동적 유형(가장 구체적인 유형)이 아닌 구조화된 유형 인수의 정적 유형(선언된 유형)만이 고려됩니다.
- 최대한 2단계 후 하나의 후보 메소드만이 남습니다. 이 메소드가 선택된 메소드입니다.
- 2단계 후 남은 후보 메소드가 없는 경우 오류가 리턴됩니다(SQLSTATE 42884).
메소드 분석의 예
다음은 성공적인 메소드 분석의 예입니다.
CREATE METHOD FOO (CHAR(5), INT, DOUBLE) FOR HEADOFSTATE SPECIFIC FOO_1 ...
CREATE METHOD FOO (INT, INT, DOUBLE) FOR HEADOFSTATE SPECIFIC FOO_2 ...
CREATE METHOD FOO (INT, INT, DOUBLE, INT) FOR HEADOFSTATE SPECIFIC FOO_3 ...
CREATE METHOD FOO (INT, DOUBLE, DOUBLE) FOR EMPEROR SPECIFIC FOO_4 ...
CREATE METHOD FOO (INT, INT, DOUBLE) FOR EMPEROR SPECIFIC FOO_5 ...
CREATE METHOD FOO (SMALLINT, INT, DOUBLE) FOR EMPEROR SPECIFIC FOO_6 ...
CREATE METHOD FOO (INT, INT, DEC(7,2)) FOR GOVERNOR SPECIFIC FOO_7 ...
SELECT E..FOO(I1, I2, D) ...
알고리즘을 통해 다음... - FOO_7은 후보로 제거됩니다. 유형 GOVERNOR이 EMPEROR의 부속 유형이기 때문입니다(슈퍼 유형 아님).
- FOO_3은 후보로 제거됩니다. 잘못된 매개변수의 수가 있기 때문입니다.
- FOO_1 및 FOO_6은 제거됩니다. 두 경우에 첫 번째 인수(주제 인수가 아닌)가 첫 번째 매개변수의 데이터 유형으로 승격될 수 없기 때문입니다. 둘 이상의 후보가 남기 때문에 인수는 순서대로 고려됩니다.
- 주제 인수의 경우, FOO_2는 슈퍼 유형이지만 FOO_4 및 FOO_5는 주제 인수와 일치합니다.
- 첫 번째 인수의 경우, 남은 메소드, FOO_4 및 FOO_5는 인수 유형과 완전 일치됩니다. 제한조건에서 제거될 수 있는 메소드는 없습니다. 그러므로 다음 인수가 조사되어야 합니다.
- 이 두 번째 인수의 경우, FOO_5는 완전 일치이지만 FOO_4는 아니므로 고려사항에서 제거됩니다. 이렇게 되면 선택된 메소드로 FOO_5가 남습니다.
메소드 호출
메소드가 선택되면 메소드 사용이 허용될 수 없는 이유가 여전히 있을 수 있습니다.
STEP(SMALLINT) FOR TYPEA RETURNS CHAR(5)
STEP(DOUBLE) FOR TYPEA RETURNS INTEGER
그리고 다음 메소드 참조(여기서
S는 SMALLINT 컬럼이며 TA는 TYPEA의 컬럼임)는 다음과 같습니다. SELECT 3 + TA..STEP(S) ...
그리고 나서,
인수 유형에 완전 일치가 있기 때문에 첫 번째 STEP가 선택됩니다. 추가 연산자의 인수에 대해 필요하므로 결과 유형이
숫자 유형 대신 CHAR(5)이기 때문에 명령문에 오류가 발생합니다. 선택된 메소드에서 시작하여,
메소드의 동적 디스패치
에서 설명된 알고리즘은
컴파일 시 디스패치 가능한 메소드 세트를 빌드하는 데 사용됩니다. 정확히 호출되는 메소드가
메소드의 동적 디스패치
에서 설명됩니다.
- 함수 결정을 따르는 정적 결과 유형은 메소드 호출의 주제 인수의 정적 유형과 동일합니다.
- 메소드가 호출되는 동적 결과 유형은 메소드 호출의 주제 인수의 동적 유형과 동일합니다.
메소드 호출의 인수가 선택된 메소드의 매개변수의 데이터 유형에 완전 일치가 아닌 경우, 인수는 컬럼에 지정과 동일한 규칙을 사용하여 실행 시 매개변수의 데이터 유형으로 변환됩니다. 정밀도, 스케일 또는 길이가 인수와 매개변수 사이에서 다른 경우를 포함하지만, 인수의 동적 유형이 매개변수의 정적 유형의 부속 유형인 경우는 제외됩니다.
메소드의 동적 디스패치
메소드는 기능을 제공하고 유형의 데이터를 캡슐화합니다. 메소드는 유형에 대해 정의되고 항상 이 유형과 연관될 수 있습니다. 메소드의 매개변수 중 하나는 내재된 SELF 매개변수입니다. SELF 매개변수는 메소드가 선언된 유형입니다. 메소드가 DML문에서 호출될 때 SELF 인수로 전달되는 인수는 주제라고 합니다.
메소드가 메소드 분석(메소드 분석 참조)을
사용하여 선택되거나 메소드가 DDL문에서 지정되면, 이 메소드를 가장 구체적으로 적용 가능한
권한 부여 메소드
라고 합니다. 주제가 구조화된 유형인 경우 해당 메소드에는 하나 이상의 겹쳐쓰기 메소드가 있을 수 있습니다. 런타임 시
주제의 동적 유형(가장 구체적인 유형)을 기반으로 호출할 메소드 선택을 결정합니다. 이 결정을
가장 구체적인 디스패치 가능한 메소드 결정
이라고 합니다.
여기에서 그 프로세스를 설명합니다.
- 가장 구체적인 적용 가능한 권한 부여 메소드가 일부인 메소드 계층 구조에서 원래 메소드를 찾습니다. 이를 루트 메소드라고 합니다.
- 디스패치 가능한 메소드 세트를 작성합니다. 여기에는 다음이 포함됩니다.
- 가장 구체적인 적용 가능한 권한 부여 메소드.
- 가장 구체적인 적용 가능한 권한 부여 메소드를 겹쳐쓰는 메소드이며, 이 호출의 주제의 부속 유형인 유형에 대해 정의됩니다.
- 가장 구체적인 디스패치 가능한 메소드를 다음과 같이 결정합니다.
- 디스패치 가능한 메소드 세트의 요소이며 주제나 슈퍼 유형 중 하나의 동적 유형의 메소드인 임의의 메소드로 시작합니다. 초기의 가장 구체적인 디스패치 가능한 메소드입니다.
- 디스패치 가능한 메소드 세트 요소를 통해 반복합니다. 각 메소드의 경우: 메소드가 가장 구체적인 디스패치 가능한 메소드가 정의된 유형의 적절한 부속 유형 중 하나에 대해 정의되고 주제의 가장 구체적인 유형의 슈퍼 유형 중 하나에 대해 정의되면, 가장 구체적인 디스패치 가능한 메소드로서 이 메소드를 사용하여 2단계를 반복합니다. 그 외의 경우 계속 반복합니다.
- 가장 구체적인 디스패치 가능한 메소드를 호출합니다.
예:
"Person", "Employee", "Manager"의 세 유형이 제공됩니다. 원래 메소드 "income"이 "Person"에 대해 정의되며, person의 income을 계산합니다. 사람은 기본적으로 고용되지 않습니다(아이, 은퇴자 등). 그러므로 유형 "Person"에 대한 "income"은 항상 영(0)을 리턴합니다. 유형 "Employee" 및 유형 "Manager"의 경우, 다른 알고리즘이 수입을 계산하는 데 적용되어야 합니다. 그러므로 유형 "Person"에 대한 메소드 "income"은 "Employee" 및 "Manager"에서 겹쳐씁니다.
CREATE TABLE aTable (id integer, personColumn Person);
INSERT INTO aTable VALUES (0, Person()), (1, Employee()), (2, Manager());
최소
$40000의 수입이 있는 모든 사람을 나열합니다. SELECT id, person, name
FROM aTable
WHERE person..income() >= 40000;
메소드 분석을 사용하여 유형 "Person"에 대한 메소드 "income"이 선택되어 가장 구체적인 적용 가능한 권한 부여 메소드가 됩니다.
- 루트 메소드는 "Person" 자체에 대한 "income"입니다.
- 이전 알고리즘의 두 번째 단계는 디스패치 가능한 메소드 세트를 구성하는 데 실행됩니다.
- 유형 "Person"의 메소드 "income"이 포함됩니다. 가장 구체적인 적용 가능한 권한 부여 메소드이기 때문입니다.
- 유형 "Employee"에 대한 메소드 "income" 및 "Manager"에 대한 "income"이 포함됩니다. 두 메소드가 루트 메소드를 겹쳐쓰고 "Employee" 및 "Manager" 모두가 "Person"의 부속 유형이기 때문입니다.
그러므로 디스패치 가능한 메소드 세트는 다음과 같습니다. {"Person"에 대한 "income", "Employee"에 대한 "income", "Manager"에 대한 "income"}.
- 가장 구체적인 디스패치 가능한 메소드 판별:
- 가장 구체적인 유형이 "Person"인 주제의 경우:
- 초기 가장 구체적인 디스패치 가능한 메소드가 유형 "Person"에 대한 "income"이 되게 합니다.
- "Person"의 적절한 부속 유형 및 주제의 가장 구체적인 유형의 슈퍼 유형으로 정의된 디스패치 가능한 메소드 세트에 다른 메소드가 없기 때문에, 유형 "Person"에 대한 "income"이 가장 구체적인 디스패치 가능한 메소드입니다.
- 가장 구체적인 유형이 "Employee"인 주제의 경우:
- 초기 가장 구체적인 디스패치 가능한 메소드가 유형 "Person"에 대한 "income"이 되게 합니다.
- 디스패치 가능한 메소드 세트를 통해 반복합니다. 유형 "Employee"에 대한 메소드 "income"이 "Person"의 적절한 부속 유형 또는 주제의 가장 구체적인 유형의 슈퍼 유형에 대해 정의되기 때문이며(참고: 유형은 고유 슈퍼 및 부속 유형임), 유형 "Employee"에 대한 메소드 "income"은 가장 구체적인 적용 가능한 메소드에 대해 더 나은 일치 항목입니다. 가장 구체적인 적용 가능한 메소드로서 유형 "Employee"에 대한 메소드 "income"을 사용하여 이 단계를 반복합니다.
- "Employee"의 적절한 부속 유형 및 주제의 가장 구체적인 유형의 슈퍼 유형으로 정의된 디스패치 가능한 메소드 세트에 다른 메소드가 없기 때문에, 유형 "Employee"에 대한 메소드 "income"이 가장 구체적인 디스패치 가능한 메소드입니다.
- 가장 구체적인 유형이 "Manager"인 주제의 경우:
- 초기 가장 구체적인 디스패치 가능한 메소드가 유형 "Person"에 대한 "income"이 되게 합니다.
- 디스패치 가능한 메소드 세트를 통해 반복합니다. 유형 "Manager"에 대한 메소드 "income"이 "Person"의 적절한 부속 유형 또는 주제의 가장 구체적인 유형의 슈퍼 유형에 대해 정의되기 때문이며(참고: 유형은 고유 슈퍼 및 부속 유형임), 유형 "Manager"에 대한 메소드 "income"은 가장 구체적인 적용 가능한 메소드에 대해 더 나은 일치 항목입니다. 가장 구체적인 적용 가능한 메소드로서 유형 "Manager"에 대한 메소드 "income"을 사용하여 이 단계를 반복합니다.
- "Manager"의 적절한 부속 유형 및 주제의 가장 구체적인 유형의 슈퍼 유형으로 정의된 디스패치 가능한 메소드 세트에 다른 메소드가 없기 때문에, 유형 "Manager"에 대한 "income"이 가장 구체적인 디스패치 가능한 메소드입니다.
- 가장 구체적인 유형이 "Person"인 주제의 경우:
- 가장 구체적인 디스패치 가능한 메소드를 호출합니다.