2016-08-08 15 views

답변

10

문서는 여기에 도움이 될 것입니다

Interfaces Extending Classes

는 인터페이스 유형은이 의 멤버 클래스가 아닌 자신의 구현을 상속하는 클래스 형식을 확장합니다. 구현을 제공하지 않고 인터페이스에 클래스의 모든 구성원을 선언 한 것처럼 보입니다. 인터페이스는 기본 클래스의 private 및 protected 멤버도 상속받습니다. 즉, 전용 또는 보호 된 멤버가있는 클래스를 확장하는 인터페이스를 만들면 해당 인터페이스 의 인터페이스는 해당 클래스 또는 하위 클래스에서만 구현할 수 있습니다.

큰 상속 계층 구조가있는 경우 유용하지만 은 코드가 특정 속성을 가진 하위 클래스에서만 작동하도록 지정해야합니다. 서브 클래스는 기본 클래스의 을 상속하는 것 외에도 관련 될 필요가 없습니다. 예를 들어 :

그래서
class Control { 
    private state: any; 
} 

interface SelectableControl extends Control { 
    select(): void; 
} 

class Button extends Control { 
    select() { } 
} 

class TextBox extends Control { 
    select() { } 
} 

class Image extends Control { 
} 

class Location { 
    select() { } 
} 

,

동안
  • extends 의미 - 그것은 거의 인터페이스를 구현처럼이 경우 부모
  • implements에서 모두 가져옵니다. 자식 개체는 부모 인 척할 수 있지만 구현이 없습니다.
+0

은? 예를 들면'class Person {private name : string} class man extends Person {gender : string;}''man'이 속성 이름을 갖고 있습니까? – davejoem

+0

비공개도 있습니다. TS에 접근하기가 쉽지 않습니다. 그들을 보호하고 그들을 사용할 수 있습니다. "구현"의 경우 공용 부분 만 이해됩니다. 희망이 조금 도움이 –

19

typescript (및 기타 OO 언어)에는 클래스와 인터페이스가 있습니다.

인터페이스에는 구현이 없으며이 유형의 멤버/메소드의 "계약"일뿐입니다. 예를 들어
: 다른 Point 인스턴스를 수신하고 number을 반환 xy, 하나의 방법 distancePoint 인터페이스를 구현

interface Point { 
    x: number; 
    y: number; 
    distance(other: 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)); 
    } 
} 

(code in playground)

당신이 클래스로 한 번 Person 클래스를 치료 :

클래스 구현입니다.
귀하의 코드 :

클래스 '남자'를 잘못 구현 인터페이스 '사람'

class Person { 
    name: string; 
    age: number; 
} 
class Child extends Person {} 

class Man implements Person {} 

말하는 컴파일 오류가 있습니다.
'Man'유형에 'name'속성이 없습니다.

인터페이스가 구현되지 않았기 때문입니다.
그래서 만약 당신이 implement 클래스 다음 만이 수행해야하므로 구현하지 않고 "계약"을 가지고 :

결론은

class NoErrorMan implements Person { 
    name: string; 
    age: number; 
} 

(code in playground을) 대부분의 경우에 당신은 extend 다른 클래스가 아니라 implement 그것을하고 싶어.

1

@ nitzan-tomer의 멋진 답변! 많이 도와 줬어 ... 나는 그의 데모를 약간 확장했다 :

IPoint interface; 
Point implements IPoint; 
Point3D extends Point; 

그리고 IPoint 유형을 예상하는 함수에서 어떻게 행동 하는가?

그래서 지금까지 익히 알고 엄지 손가락 규칙으로 사용하고 있습니다. 일반적인 유형을 예상하는 클래스와 메소드를 사용하는 경우 인터페이스를 예상 유형으로 사용하십시오. 부모 또는 기본 클래스가 해당 인터페이스를 사용하는지 확인하십시오. 그렇게하면 인터페이스를 구현하는 모든 하위 클래스를 사용할 수 있습니다.

하이어 당신이 개인 회원에 적용 않는다 "extends`-은 모든 부모로부터 얻는`"말하는 extended demo

+0

이것은 질문에 대한 답변을 제공하지 않습니다. 비평하거나 저자의 설명을 요청하려면 게시물 아래에 의견을 남겨 둡니다. - [리뷰에서] (리뷰/저품절 포스트/18734440) – aronisstav

+0

@aronisstav 나는 이미 내가 도움이 된 좋은 대답을 발견했다. 하지만 다른 누군가가 내가 데모를 유용하게 사용한 것을 발견하게 될 것입니다. 그게 다야. 코멘트는 실제로 코드 블록을 넣는 것에 대한 것이 아니므로 Answer Post에 더 잘 이해할 수 있습니다. 그래서 그게 무슨 문제입니까? – andzep

+0

귀하의 답변은 길이와 내용으로 인해 (자동으로) 표시되었으며, 내 검토 대기열에 표시되었으며, 국기에 표시된 이유에 대해 장점을 보였습니다. 데모 확장을 설명하는 주요 기여는 댓글로 더 좋을 것입니다. 추가 단락을 사용하면 아마 더 유용 할 것입니다. – aronisstav