최근에 PHP5 인터페이스를 배우는 과정에서 어려움을 겪었습니다. 책에서는 다중상속을 구현하는 방법이라고 했는데, 아직 어떻게 구현해야 할지 모르겠습니다. 인터넷에 PHP 인터페이스에 대한 정보가 거의 없어서 Java로 확인해 보니 실제로는 기본적으로 동일합니다. "Java(인터페이스 및 상속) 명확화"라는 기사를 읽고 문득 처음부터 잘못 이해했다는 사실을 깨달았습니다. 소위 다중 상속이란 인터페이스를 상속하는 클래스가 아니라 인터페이스를 상속하는 것을 의미합니다.
기사에서 OO의 추상화에 대해 언급했는데, "추상화는 이미지 부분을 제거하는 것이다"라는 문장이 참 생생하네요. 추상화에 대해 생각할 때 늘 이해하기 어렵다고 생각했어요. , 이제 이해하기 쉽습니다. 이것이 바로 인터페이스와 추상 클래스의 기능입니다.
아래 나열된 것처럼 이 기사에는 나에게 많은 도움이 된 다른 많은 관점이 있습니다.
OO의 본질은 객체의 추상화라고 생각합니다.
간단히 말해서 인터페이스의 기능은 클래스 유형을 표시하는 것입니다. 다양한 유형의 클래스를 다양한 인터페이스에 할당하면 클래스를 더 잘 관리할 수 있습니다.
상속의 핵심은 코드 재사용이 아니라 추상화입니다.
이 기사를 읽은 후 이제 인터페이스, 추상 클래스 및 상속을 적용하는 방법을 기본적으로 이해했습니다.
원문은 다음과 같습니다.
Java 설명(인터페이스 및 상속) 컴퓨터 과학부 대학원생인 제 동생이 저와 만났을 때 인터페이스의 용도에 관한 몇 가지 질문이 있었습니다. 인터페이스를 사용하는 이유는 무엇입니까? 인터페이스는 언제 사용해야 합니까? Java를 사용하여 SQL Server에 연결하는 방법이나 J2EE 응용 프로그램을 개발하는 방법을 묻지 않은 것이 다행입니다. 이러한 질문은 치명적이므로 피해야 합니다. 올해 컴퓨터과학과에서 J2ME에 대한 졸업 프로젝트 프로젝트가 있었는데, 이 주제를 선택한 학생들은 5월 말에도 여전히 얼굴을 찡그린 채 java.util.* 패키지를 공부하고 있었는데, 이것저것…
대부분의 사람들은 인터페이스의 목적이 다중 상속을 대체하는 것이라고 믿습니다. 우리 모두 알고 있듯이 Java에는 C++와 같은 다중 상속 메커니즘이 없지만 다중 인터페이스를 구현할 수 있습니다. 사실 이것은 말도 안되는 이야기입니다. 인터페이스와 상속은 완전히 다른 것입니다. 인터페이스는 다중 상속을 대체할 수 있는 능력이 없으며 그러한 의무도 없습니다. 간단히 말해서 인터페이스의 기능은 클래스 유형을 표시하는 것입니다. 다양한 유형의 클래스를 다양한 인터페이스에 할당하면 클래스를 더 잘 관리할 수 있습니다. 객체지향의 본질은 객체의 추상화라고 생각하는데, 이를 가장 잘 구현하는 것이 인터페이스입니다. 우리가 추상적인 능력을 갖춘 언어(C++, Java, C# 등)에 대해서만 디자인 패턴을 논의하는 이유는 디자인 패턴을 연구하는 것이 실제로는 합리적으로 추상화하는 방법이기 때문입니다. (카우보이의 유명한 명언 중 "추상은 이미지 부분을 제거하는 것이다"라는 말이 농담처럼 보이지만 실제로는 사실이다.)
디자인 패턴 중 가장 기본적인 것은 팩토리 패턴입니다. 최근에 만든 매우 간단한 애플리케이션에서 저는 프로그램을 여러 데이터베이스 간에 이식할 수 있도록 최선을 다하고 싶었습니다. 물론 여기에는 SQL 호환성을 비롯한 많은 문제가 포함됩니다. 다른 DBMS에서 오는 것은 골치 아픈 일입니다. 먼저 문제를 단순화하고 다른 데이터베이스를 연결하는 방법만 고려할 수도 있습니다.
Mysql.java, SQLServer.java, Oracle.java 및 DB2.java와 같은 많은 클래스가 있다고 가정합니다. 이들은 각각 다른 데이터베이스에 연결하고 Connection 개체를 균일하게 반환하며 모두 연결을 닫는 닫기 메서드를 가지고 있습니다. DBMS에 대해 다른 클래스를 선택하면 사용할 수 있습니다. 하지만 내 사용자는 어떤 데이터베이스를 사용하게 될까요? 나는 그의 요구를 충족시키기 위해 코드를 가능한 한 적게 수정하는 것을 희망합니다. 다음 인터페이스를 추상화할 수 있습니다.
패키지 org.bromon.test;
공용 인터페이스 DB
{
java.sql.Connection openDB(문자열 URL, 문자열 사용자, 문자열 비밀번호);
무효 닫기();
}
이 인터페이스는 의미 있는 코드 없이 두 개의 메소드만 정의합니다. 특정 코드는 Mysql.java와 같이 이 인터페이스를 구현하는 클래스에 의해 제공됩니다.
Package org.bromon.test;
import java.sql.*;
공개 클래스 Mysql은 DB를 구현합니다.
{
개인 문자열 url="jdbc:mysql:localhost:3306/test";
개인 문자열 사용자="루트";
개인 문자열 비밀번호 =””;
개인 연결 연결;
공개 연결 openDB(url,user,password)
{
//데이터베이스 연결 코드}
public void close()
{
//데이터베이스 닫기}
}
물론 Oracle.java 등도 있습니다. 인터페이스 DB는 이러한 클래스를 애플리케이션에서 다음과 같이 정의합니다.
org.bromon.test.DB myDB를
사용하여 데이터베이스를 작동합니다. 걱정할 필요가 없습니다. 제가 실제로 사용하고 있는 클래스는 "개방-폐쇄" 원칙입니다. 그러나 문제는 인터페이스를 인스턴스화할 수 없다는 것입니다. myDB=new DB(), 이러한 코드는 완전히 잘못되었습니다. myDB=new Mysql() 또는 myDB=new Oracle()만 가능합니다. 죄송합니다. 인스턴스화할 클래스를 지정해야 합니다. 인터페이스를 사용하는 것은 쓸모가 없습니다. 그래서 우리는 팩토리가 필요합니다:
package org.bromon.test;
공개 클래스 DBFactory
{
공용 정적 DB 연결 getConn()
{
Return(새 MySQL());
}
}
따라서 인스턴스화 코드는 다음과 같습니다. myDB=DBFactory.getConn();
23가지 모드 중 가장 기본적인 일반 팩토리(Factory)입니다. 팩토리 클래스는 DB 인터페이스에서 작동하는 클래스와 기타 프로그램 로직을 구체적으로 인스턴스화하는 역할을 담당합니다. 물론 책임은 팩토리 클래스에 전달되었으며 계속해서 팩토리 인터페이스를 정의하고 책임을 계속해서 던져 추상 팩토리로 발전시킬 수도 있습니다.
인터페이스는 전체 프로세스 동안 특정 작업을 담당하지 않습니다. 다른 프로그램이 데이터베이스에 연결하려는 경우 팩토리 클래스가 어떻게 변경되는지에 관계없이 DB 개체만 구성하면 됩니다. 인터페이스란 바로 추상화입니다.
말할 필요도 없이 상속의 개념은 이해하기 쉽습니다. 왜 상속받나요? 코드를 재사용하고 싶기 때문에? 이것은 확실히 이유가 아닙니다. 상속의 요점은 코드 재사용이 아니라 추상화입니다. 객체 A에 run() 메서드가 있으면 객체 B도 이 메서드를 갖고 싶어하므로 누군가 클래스 B 확장 A를 사용합니다. 이것은 무의미한 접근 방식입니다. B에서 A를 인스턴스화하고 A의 Run() 메서드를 호출하면 동일한 목적을 달성할 수 있습니까? 다음과 같이:
클래스 B
{
Aa=새로운 A();
a.run();
}
이는 클래스 집합을 사용하여 코드를 재사용하는 것입니다. 이는 위임 모델의 프로토타입이자 GoF가 항상 옹호해 온 방식입니다.
그렇다면 상속의 요점은 무엇입니까? 사실 이는 역사적 이유 때문입니다. 원래 OO 언어에는 상속만 있고 인터페이스가 없었기 때문에 상속을 통해서만 추상화가 가능했습니다. 상속의 원래 의도는 코드 재사용이 아니라 추상화라는 점에 유의하세요. 효과) 이것은 많은 나쁜 Java 책의 가장 심각한 실수 중 하나입니다. 나쁜 책은 사람들에게 해롭습니다. 특히 입문 책은 너무 유독합니다. 언제 상속을 사용해야 합니까? 추상 클래스에서만 사용하고 다른 상황에서는 사용하지 마십시오. 추상 클래스는 인스턴스화할 수 없습니다. 문제를 보여주는 템플릿만 제공합니다.
소프트웨어 개발, 특히 C++ 프로그래머 사이에서 모든 악의 근원은 코드 재사용 대신 코드 복제와 상속의 오용입니다. Java에서 다중 상속을 금지하는 목적은 상속의 잘못된 사용을 중지하는 것입니다. 이는 매우 현명한 접근 방식이지만 많은 사람들이 이를 이해하지 못합니다. Java는 디자인을 더 잘 반영할 수 있다는 점이 제가 매료된 이유 중 하나입니다.