답변:
extends
방법:새로운 클래스는 아이입니다 . 상속과 함께 오는 이점을 얻습니다. 모든 속성, 메서드가 부모로 있습니다. 이들 중 일부를 재정의하고 새로 구현할 수 있지만 부모 항목은 이미 포함되어 있습니다.
implements
방법:새로운 클래스 로 취급 할 수 같은 "모양" 하면서, 그 아이가 아닌 . Person
부모가 다른 것과 상관없이 필요한 모든 메서드에 전달할 수 있습니다.Person
에서 OOP (C #, 자바와 같은 언어) 우리가 사용하는 것
extends
상속으로 이익을 얻습니다 ( wiki 참조 ). 작은 인용 :
... 대부분의 클래스 기반 객체 지향 언어에서 상속은 하나의 객체가 부모 객체의 모든 속성과 동작을 획득하는 메커니즘입니다. 상속을 통해 프로그래머는 다음을 수행 할 수 있습니다. 기존 클래스를 기반으로하는 클래스 생성 ...
implements
다형성에 더 가깝습니다 ( wiki 참조 ). 작은 인용 :
... 다형성은 서로 다른 유형의 엔티티에 대한 단일 인터페이스를 제공하는 것입니다 ...
그래서, 우리는 우리의 class Man
.
class Man extends Human ...
그러나 우리가 다른 유형 인 척 할 수 있다고 선언하면- Person
:
class Man extends Human
implements Person ...
.. Person
필요한 곳 어디에서나 사용할 수 있습니다 . 우리는 사람의 사항을 충족해야합니다 "interface"
(즉, 모든 공공 물건을 구현) .
implement
다른 수업? 정말 멋진 것입니다자바 스크립트의 멋진 얼굴 (이점 중 하나) 은 덕 타이핑의 내장 지원입니다 ( wiki 참조 ). 작은 인용 :
"오리처럼 걷다가 오리처럼 꽥꽥 거리면 오리 일 것입니다."
그래서, 자바 스크립트, 두 개의 서로 다른 개체 경우 ... 하나 유사한 방법있을 것입니다 (예를 render()
) 그들은 그것을 기대하고 함수에 전달 될 수있다 :
function(engine){
engine.render() // any type implementing render() can be passed
}
그것을 잃지 않기 위해-우리는 Typescript에서 더 많은 유형의 지원으로 똑같이 할 수 있습니다. 그리고 그것이
class implements class
의미가있는 역할이 있습니다.
OOP 언어에서 C#
... 할 방법이 없습니다 ...
클래스를 확장하는 인터페이스
인터페이스 유형이 클래스 유형을 확장하면 해당 구현이 아닌 클래스의 멤버를 상속합니다. 인터페이스가 구현을 제공하지 않고 클래스의 모든 멤버를 선언 한 것과 같습니다. 인터페이스는 기본 클래스의 개인 및 보호 멤버도 상속합니다. 즉, private 또는 protected 멤버로 클래스를 확장하는 인터페이스를 만들 때 해당 인터페이스 유형은 해당 클래스 또는 하위 클래스에 의해서만 구현 될 수 있습니다.
이것은 큰 상속 계층 구조가 있지만 특정 속성이있는 하위 클래스에서만 코드가 작동하도록 지정하려는 경우에 유용합니다. 하위 클래스는 기본 클래스에서 상속하는 것 외에 관련 될 필요가 없습니다. 예를 들면 :
class Control { private state: any; } interface SelectableControl extends Control { select(): void; } class Button extends Control implements SelectableControl { select() { } } class TextBox extends Control { select() { } } // Error: Property 'state' is missing in type 'Image'. class Image implements SelectableControl { private state: any; select() { } } class Location { }
그래서
extends
의미-부모로부터 모든 것을 얻습니다.implements
이 경우 인터페이스를 구현하는 것과 거의 같습니다. 자식 개체는 부모 인 척할 수 있지만 구현을 얻지 못합니다.extends
-it gets all from its parent" 라고 말하면 개인 구성원에게 적용됩니까? 예를 들어 class Person {private name: string} class man extends Person{gender: string;}
않는 man
속성 이름이?
타이프 스크립트 (및 기타 OO 언어)에는 클래스와 인터페이스가 있습니다.
인터페이스에는 구현이 없으며이 유형의 멤버 / 메서드에 대한 "계약"일뿐입니다.
예를 들면 :
interface Point {
x: number;
y: number;
distance(other: Point): number;
}
이 구현 인스턴스 Point
: 인터페이스 유형 번호의 두 멤버가 있어야 x
하고 y
, 하나의 방법은 distance
다른 수신 Point
인스턴스를하고를 반환합니다 number
.
인터페이스는 이들 중 어느 것도 구현하지 않습니다.
클래스는 구현입니다.
class PointImplementation implements Point {
public x: number;
public y: number;
constructor(x: number, y: number) {
this.x = x;
this.y = y;
}
public distance(other: Point): number {
return Math.sqrt(Math.pow(this.x - other.x, 2) + Math.pow(this.y - other.y, 2));
}
}
( 놀이터의 코드 )
귀하의 예제에서는 Person
클래스를 확장 할 때 한 번 클래스로 취급 하고 구현할 때 한 번은 인터페이스로 취급합니다.
코드 :
class Person {
name: string;
age: number;
}
class Child extends Person {}
class Man implements Person {}
다음과 같은 컴파일 오류가 있습니다.
'Man'클래스가 'Person'인터페이스를 잘못 구현합니다.
'Man'유형에 'name'속성이 없습니다.
인터페이스가 구현되지 않았기 때문입니다.
따라서 implement
클래스 인 경우 구현없이 "계약"만 가져 오므로 다음을 수행해야합니다.
class NoErrorMan implements Person {
name: string;
age: number;
}
( 놀이터의 코드 )
결론은 대부분의 경우 extend
다른 클래스가 아닌 다른 클래스 를 원한다는 implement
것입니다.
@ nitzan-tomer의 훌륭한 답변! 저를 많이 도왔습니다 ... 저는 그의 데모를 다음과 같이 약간 확장했습니다.
IPoint interface;
Point implements IPoint;
Point3D extends Point;
그리고 IPoint
유형을 기대하는 함수에서 어떻게 작동하는지 .
그래서 내가 지금까지 배웠고 엄지 규칙으로 사용하고있는 것은 : 제네릭 유형을 기대하는 클래스와 메서드를 사용하는 경우 인터페이스를 예상 유형으로 사용하십시오. 그리고 부모 또는 기본 클래스가 해당 인터페이스를 사용하는지 확인하십시오. 이렇게하면 인터페이스를 구현하는 한 모든 하위 클래스를 사용할 수 있습니다.
여기에 확장 된 데모
extends
: 자식 클래스 (확장 됨)는 클래스의 모든 속성과 메서드를 상속 합니다.implements
: implements
키워드 를 사용하는 클래스는 키워드 를 사용하는 클래스의 모든 속성과 메서드 를 구현 해야 합니다.implements
더 간단하게 말하면 :
extends
: 여기에서 부모 클래스에서 이러한 모든 메서드 / 속성을 가져 오므로 직접 구현할 필요가 없습니다.implements
: 여기에 수업이 따라야 할 계약이 있습니다. 클래스는 최소한 다음 메소드 / 속성 을 구현 해야합니다.class Person {
name: string;
age: number;
walk(): void {
console.log('Walking (person Class)')
}
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
}
class child extends Person { }
// Man has to implements at least all the properties
// and methods of the Person class
class man implements Person {
name: string;
age: number
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
walk(): void {
console.log('Walking (man class)')
}
}
(new child('Mike', 12)).walk();
// logs: Walking(person Class)
(new man('Tom', 12)).walk();
// logs: Walking(man class)
예제에서 우리는 자식 클래스가 Person으로부터 모든 것을 상속받는 반면, man 클래스는 Person 자체에서 모든 것을 구현해야한다는 것을 관찰 할 수 있습니다.
예를 들어 walk 메소드와 같이 man 클래스에서 무언가를 제거하면 다음과 같은 컴파일 시간 오류가 발생합니다.
'man'클래스가 'Person'클래스를 잘못 구현합니다. 'Person'을 확장하고 그 구성원을 하위 클래스로 상속하려고 했습니까? 'man'유형에는 'walk'속성이 없지만 'Person'유형에는 필수입니다. (2720)