>  기사  >  다른 클래스를 확장하는 클래스에서 메서드 가져오기

다른 클래스를 확장하는 클래스에서 메서드 가져오기

王林
王林앞으로
2024-02-09 08:40:30506검색

PHP에서는 한 클래스에 다른 클래스의 메소드를 사용해야 하는 상황이 자주 발생합니다. 이때 다른 클래스를 상속하거나 인스턴스화하여 해당 메서드를 얻을 수 있습니다. 상속이란 한 클래스가 다른 클래스의 속성과 메서드를 상속하는 것을 의미하며, 이는 확장 키워드를 통해 달성됩니다. 인스턴스화란 클래스의 인스턴스 객체를 생성하고, 해당 객체를 통해 다른 클래스의 메서드를 호출하는 것을 말합니다. 상속이든 인스턴스화이든 한 클래스에서 다른 클래스의 메서드를 쉽게 얻을 수 있어 코드의 재사용성과 유연성이 향상됩니다.

질문 내용

다른 수업을 확장하는 수업이 있어요. 사용자 입력에 따라 "a"를 입력하면 클래스는 하위 클래스 a가 되어야 하지만, "b"를 입력하면 클래스는 하위 클래스 b가 됩니다. 메인 클래스에 만들어야 할 변수가 있습니다. 내가 정의한 변수가 메인 클래스에서 왔기 때문에 하위 클래스의 메서드에 액세스할 수 없습니다. 어떻게 작동하게 할 수 있나요?

다음은 분해의 예입니다. myclass 변수는 다른 곳에서 사용되므로 어디에서나 하위 클래스로 사용할 수 있어야 합니다.

으아악

메인 클래스에 subclassamethod와 subclassbmethod를 넣을 수 있다는 것을 알고 있지만, 서브클래스의 일부가 아닌 경우 이러한 메서드를 호출할 수 있기를 원하지 않습니다.

myclass가 subclassa와 subclassb를 모두 허용하도록 선언할 수 있는 방법이 있나요?

해결 방법

이는 변수 myclass 存在,并且被限制为指向 null,或者指向类的实例,使得该类是 mainclass 또는 그 하위 유형을 의미합니다.

java가 설정된 방식에 따라 java는 가능한 모든 시나리오에서 합리적이지 않는 한 이 변수와의 모든 상호 작용 컴파일을 거부합니다. p>

즉, 당신 이 코드 흐름의 어느 시점에서 해당 변수가 mysubclassb의 인스턴스를 가리켜야 한다는 것을 합리적인 의심을 넘어 증명할 수 있더라도 컴파일러는 이에 대해 신경 쓰지 않을 것입니다.

귀하의 코딩 스타일이 의심스럽습니다. 이것은 당신의 자바 방식이 아닙니다.

myclass 변수 이름은 "이게 어떻게 작동하는지 이해가 안 돼요"라고 비명을 지른다는 점에 유의하세요. 이는 매우 오해의 소지가 있습니다. 변수는 클래스가 아닌 인스턴스만 참조할 수 있습니다.

참고로 static 在您的代码片段中被滥用。静态对于大多数java项目来说通常不是必需的,也是一个比较高级的概念。如果您不想了解其具体含义,也没关系。但你一定不能使用它。 main 目前必须是静态的(很快从 jdk22+ 开始就不必是静态的),所以解决方案是立即摆脱 static .

다음은 이를 수행하는 방법의 예입니다. 다음 코드 조각은 유형과 변수에 더 나은 이름을 사용하여 상황을 더 명확하게 만듭니다.

으아악

new subclassa() 코드와 myobject.subclassamethod() 코드가 가깝지 않으면 작동하지 않습니다. new subclassa() 和代码 myobject.subclassamethod() 不靠近,那么这将不起作用。您必须使用 instanceof 来检查 myclass(역시 매우 잘못된 이름)가 올바른 유형인지 확인하려면 instanceof를 사용해야 합니다. 다음과 같습니다:

으아악

이것은 animal 是否指向 dog 实例或 dog 类型的某个子类型的对象。如果不是,则 if 不会按照您的预期执行任何操作(animal 不是 dog 的实例,因此 if 不会执行其内容)。如果是,则创建一个新变量 dog dog 指向它,输入 dog를 확인하여 이에 대해 개 전용 메소드를 호출할 수 있도록 합니다.

일반적으로 instanceof를 사용하면 코드가 잘못 설정되었음을 의미합니다. 변수 animal Animal의 요점은 모든 동물instanceof 意味着您的代码设置错误。拥有变量 animal animal 的全部意义在于它可以包含任何动物 - 如果您的代码实际上需要它是一只狗,那么它应该是 dog dog。或者,您应该有一个该代码的子类,一个专门针对 dogs 的版本,其中有一个定义为 dog dog 的字段。如果它是一个对多种对象的细节进行编码的方法(if(猫猫的动物实例)docatthing(); else if(狗狗的动物实例)dodogthing();等的大列表),那么应该实际上是 animal 类中的一个抽象方法,animal 的每个实现都提供一个实现:带有 class dog을 포함할 수 있다는 것입니다. 코드에서 실제로 개여야 하는 경우 dog dog여야 합니다. . 또는 해당 코드의 하위 클래스, 즉 dog dog로 정의된 필드가 있는 개 전용 버전이 있어야 합니다. 여러 개체의 세부 정보를 인코딩하는 메서드인 경우(if (animal 인스턴스 of cat) docatthing(); else if (animal 인스턴스 of dog) dodogthing(); etc. list) 실제로 animal 클래스의 추상 메서드여야 하며 animal의 각 구현은 구현을 제공합니다. class dog를 사용하면 > dog- 특정 코드는 개 특정 코드가 존재하는 곳이기 때문입니다.

어느 쪽이든 instanceof는 필요하지 않으므로 instanceof,因此,如果你确实使用 instanceof해야 한다면

instanceof를 사용하세요. 특히 초보자가 사용하는 경우에는 코드 스타일 측면에서 95% 이상의 시간이 소요됩니다. 매우 나쁜 방법입니다. "나쁜"이란 이해하기 어렵고 유연성이 없음(코드 요구 사항의 향후 변경은 모든 비학술 프로젝트에서 항상 겪는 일이므로 생각보다 더 많은 노력이 필요함), 기존 라이브러리에 통합하기 어렵고 종종 클래스별 Java가 아닌 것을 의미합니다. is - 지구상의 대부분의 Java 프로그래머가 수행하는 작업이 아니므로 이 코드의 학습 및 이해 곡선을 불필요하게 복잡하게 만듭니다. 🎜

위 내용은 다른 클래스를 확장하는 클래스에서 메서드 가져오기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제