추상 클래스 대 인터페이스
이 질문에 이미 답변이 있습니다.
- 인터페이스 대 추상 클래스 (일반 OO) 34 답변
나는 좋은 대답을 위해 웹의 나머지 부분뿐만 아니라 SO 주위를 검색했지만 실제로 이해하는 것을 찾지 못했습니다. 나는 이것을 다른 방식으로 제시 할 것이며, 답변이 다른 사람들에게도 도움이되기를 바랍니다.
내가 이해하는 한, 두 개념은 메서드 구현 능력으로 인해 추상 클래스가 더 유연하다는 점을 제외하고는 동일한 규칙을 가지고 있습니다. 또한 여러 인터페이스를 구현하고 단일 클래스 만 확장 할 수 있다는 것을 알고 있지만 앞서 언급 한 두 가지보다 더 많은 차이점이 있다고 확신합니다.
두 개의 코드 스 니펫을보고 다른 것을 사용하고 싶거나 사용하고 싶지 않은 각 예제로 무엇을 할 수 있는지 예제를 제공하십시오.
추상 클래스
abstract class Foo {
abstract public function getValue();
abstract public function setValue($value);
}
class myObj extends Foo {
function getValue() {
}
function setValue($value) {
}
}
상호 작용
interface Foo {
public function getValue();
public function setValue($value);
}
class myObj implements Foo {
function getValue() {
}
function setValue($value) {
}
}
아이디어를 재개하려면 (상세하지 않고 전체적으로) :
inheritance
에 대한 개념 extend from something
이며 선택적으로 일부 새 기능을 추가하거나 기존 기능을 재정의합니다 (다르게 수행). 그러나 상속을 사용하면 부모와 코드의 큰 부분을 공유합니다. 당신은 부모 + 다른 것들입니다.
interface
일부 능력을 나타냅니다 (우리는 클래스가 이러한 능력을 가지고 있다고 말하는 인터페이스를 구현 한다고 말합니다). 인터페이스는 완전히 다르고 코드를 공유하지 않는 2 개의 클래스로 구현 될 수 있습니다 (구현하는 메소드 제외). A와 B가 인터페이스 C를 구현할 때 A는 B가 아니고 B는 A가 아닙니다.
그리고 그 이유 중 하나 interface
는 실제로 프로그래머가 다중 상속으로 할 수있는 것과 똑같이 할 수 있지만 다중 상속 문제없이 할 수 있도록하기 위함입니다 .
이 개념은 JAVA, PHP와 같은 일부 프로그래밍 언어에서 사용됩니다.
요약
추상 클래스는 일종의 유사성에 중점을 둡니다.
사람들은 유형 mammal
으로 간주되므로 유형으로 간주되지 않습니다 vehicle
.
상호 작용
인터페이스는 유사한 기능의 데이터 정렬에 중점을 둡니다.
예 : 당신은 인간이고 유형 mammal
입니다. 비행을 원하면 flying Interface
. 비행 중에 쏘고 싶다면 gun Interface
.
아래 예를 참조하십시오.
abstract class Mammal {
protected $age_;
//below are functions I think all mammals will have,including people
abstract public function setAge($age);
abstract public function getAge();
abstract public function eat($food);
}
class Person extends Mammal {
protected $job_; //Person's feature
public function setAge($age){
$this->age_ = $age;
}
public function getAge(){
return $this->age_;
}
public function eat($food){
echo 'I eat ' ,$food ,'today';
}
//People only attribute
public function setJob($job){
$this->job_ = $job;
}
public function getJob(){
echo 'My job is ' , $this->job_;
}
}
//Now a person wants to fly, but they are typically not able to do so.
//So we implement an interface
interface Plane{
public function Fly();
}
//I also want shoot enemy
interface Gun{
public function shoot();
}
class Person2 extends Mammal implements Plane,Gun{
protected $job_;//Person feature
public function setAge($age){
$this->age_ = $age;
}
public function getAge(){
return $this->age_;
}
public function eat($food){
echo '<br/>I eat ' ,$food ,' today<br/>';
}
//Only a person has this feature.
public function setJob($job){
$this->job_ = $job;
}
public function getJob(){
echo 'My job is ' , $this->job_;
}
//-----------------------------------------
//below implementations from interfaces function. (features that humans do not have).
//Person implements from other class
public function fly(){
echo '<br/>I use plane,so I can fly<br/>';
}
public function shoot(){
echo 'I use gun,so I can shoot<br/>';
}
}
$People = new Person();
echo '<pre>';
print_r( get_class_methods('People'));
echo '</pre>';
echo '<pre>';
print_r( get_class_methods('People2'));
echo '</pre>';
$People2 = new Person2();
$People2->setAge(24);
echo $People2->getAge();
$People2->eat('egg');
$People2->setJob('PHP devepop');
echo $People2->getJob();
$People2->fly();
$People2->shoot();
간단히 말해서 인터페이스 는 함수 집합을 표준화하는 반면 추상 클래스 는 파생 할 클래스의 기본 골격을 정의하는 것입니다.
I have thought about this before, and the best I could conclude was that interfaces are a logically convenient abstraction of a pure abstract class (c++).
As for why you would choose interfaces over abstract classes, I quote (a c++ source but the concepts are the same):
Note that there is a great temptation to add concrete member functions and data to pure abstract base classes. This must be resisted, in general it is a sign that the interface is not well factored. Data and concrete member functions tend to imply a particular implementation and as such can inherit from the interface but should not be that interface. Instead if there is some commonality between concrete classes, creation of abstract class which inherits its interface from the pure abstract class and defines the common data and member functions of the concrete classes works well.
The thing is, when using interfaces, the first thing that comes to mind is decoupling. When using an interface, the user and the implementing-class are totally decoupled. The same applies for when you're using a pure abstract class which is basically an interface.
참고URL : https://stackoverflow.com/questions/15960729/abstract-class-vs-interface
'Program Tip' 카테고리의 다른 글
SASL 인증 단계에서 서버가 오류를 반환했습니다. 인증 실패 (0) | 2020.12.14 |
---|---|
JavaScript에서 OS 경로 구분 기호를 결정하는 방법은 무엇입니까? (0) | 2020.12.14 |
Django manage.py 알 수없는 명령 : 'syncdb' (0) | 2020.12.13 |
macOS Mojave에서 Xcode 10 네트워크 링크 조절기를 설치할 수 없음 (0) | 2020.12.13 |
Ruby on Rails의 숨겨진 기능 (0) | 2020.12.13 |