REPORT Z_PRIMENUMBER.
CLASS ZCL_NTH_PRIME DEFINITION FINAL CREATE PUBLIC.
PUBLIC SECTION.
METHODS prime
IMPORTING
input TYPE i
RETURNING
VALUE(result) TYPE i
RAISING
cx_parameter_invalid.
PROTECTED SECTION.
PRIVATE SECTION.
ENDCLASS.
CLASS ZCL_NTH_PRIME IMPLEMENTATION.
METHOD prime.
IF input = 0.
RAISE EXCEPTION TYPE cx_parameter_invalid.
ENDIF.
DATA prime_number TYPE i.
DATA prime_count TYPE i.
prime_number = 2.
prime_count = 0.
DO.
IF check_prime(prime_number) = abap_true.
prime_count = prime_count + 1.
ENDIF.
IF prime_count = input.
result = prime_number.
EXIT.
ENDIF.
prime_number = prime_number + 1.
ENDDO.
ENDMETHOD.
METHOD check_prime.
DATA number TYPE i.
DATA is_prime TYPE abap_bool.
number = 2.
is_prime = abap_true.
DO number = 2 TO sqrt(input).
IF input MOD number = 0.
is_prime = abap_false.
EXIT.
ENDIF.
ENDDO.
result = is_prime.
ENDMETHOD.
ENDCLASS.
DATA: nth_prime TYPE i,
result TYPE i.
nth_prime = 10.
DATA: prime_calculator TYPE REF TO ZCL_NTH_PRIME.
CREATE OBJECT prime_calculator.
TRY.
prime_calculator->prime( nth_prime )->result.
result = nth_prime.
WRITE: / 'The', nth_prime, 'th prime number is', result.
CATCH cx_parameter_invalid INTO DATA(exception).
WRITE: / 'Error:', exception->get_text( ).
ENDTRY.
显示错误:字段“CHECK_PRIME”未知。在这一行(IF check_prime(prime_number) = abap_true。) 另一个错误是:方法“CHECK_PRIME”未在类“ZCL_NTH_PRIME”中声明或继承。在这一行(方法 check_prime。)
我期待这段代码会显示第 n 个数字之后的素数
错误消息
The method "CHECK_PRIME" is not declared or inherited in class "ZCL_NTH_PRIME"
的含义正是如此。您正在尝试实现并调用您未在 CLASS ZCL_NTH_PRIME DEFINITION
和相应的 ENCLASS.
之间声明的方法。
您的类定义中有一个名为
prime
的方法,但没有名为 check_prime
的方法。因此,您需要做的是添加第二个方法的声明。从上下文和您在该方法的实现中使用的未声明的变量猜测,我想说它必须看起来像这样:
METHODS check_prime
IMPORTING
input TYPE i
RETURNING
VALUE(result) TYPE abap_bool.
这个定义到底属于哪里?考虑到该方法似乎不是从类外部调用的,因此它不需要位于
PUBLIC SECTION
中。考虑到该类是FINAL
,所以不可能有任何类继承它。这意味着在 PROTECTED SECTION
中放入任何内容都是没有意义的。所以你应该把它放入PRIVATE SECTION
。