programing

TypeScript의 '확장'과 '실장'의 차이점은 무엇입니까?

abcjava 2023. 4. 6. 20:43
반응형

TypeScript의 '확장'과 '실장'의 차이점은 무엇입니까?

는 남자와 아이의 공통점과 차이점을 알고 싶다.

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

쇼트 버전

  • extends 다음을 의미합니다.

새로운 반은 아이입니다.그것은 상속과 함께 이익을 얻는다.그것은 부모의 모든 속성과 방법을 가지고 있다.이들 중 일부를 덮어쓰고 새로운 것을 구현할 수 있지만 이미 상위 항목이 포함되어 있습니다.

  • implements 다음을 의미합니다.

클래스는 동일 "모양"으로 취급할 수 있지만 하위 클래스는 아닙니다.그것은 어떤 방법으로든 전달될 수 있다.Person는, 「」와 다른 것에 Person.

기타...

OOP(C#이나 Java 등의 언어)에서는

extends 상속을 통해 이익을 얻습니다.

...대부분의 클래스 기반 객체 지향 언어에서의 상속은 하나의 객체가 부모 객체의 모든 속성 및 동작을 취득하는 메커니즘입니다.상속을 통해 프로그래머는 기존 클래스를 기반으로 하는 클래스를 만들 수 있습니다.

implements 다형성에 더 가까울 거예요

...다형성은 다른 유형의 엔티티에 단일 인터페이스를 제공하는 것입니다.

수 .Man:

class Man extends Human ...

하지만 우리가 선언할 수 있다면Man의 를 낼 수 있다Person 삭제:

class Man extends Human 
          implements Person ...

할 수 ...어디서나 사용할 수 있습니다.Person필수 항목입니다.우리는 그저 그 일을Person의 「인터페이스」(즉, 퍼블릭한 것을 모두 실장)

implement정말 멋지다

Javascript의 멋진 얼굴(장점 중 하나)은 오리타입을 지원하는 내장형입니다.

"만약 그것이 오리처럼 걷고 오리처럼 울부짖는다면, 그것은 오리일 것입니다."

Javascript에서 두 한 메서드를 경우( "Javascript는 과 같습니다.render() 수 : ) 、 음 、 음 、 다 、 다 、 다 、 다 ) 、 ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) 。

function(engine){
  engine.render() // any type implementing render() can be passed
}

Typescript에서 이를 잃지 않으려면 더 많은 Typescript 지원에서도 동일한 작업을 수행할 수 있습니다.그리고 그게 바로

class implements class

그 역할이 있고, 그게 말이 되는 부분이죠.

에서는 OOP로 됩니다.C#그럴 방법이 없어요

이 문서는 다음 사항에 도움이 됩니다.

클래스를 확장하는 인터페이스

인터페이스 타입이 클래스 타입을 확장하면 클래스 멤버는 상속되지만 구현은 상속되지 않습니다.이것은, 실장을 실시하지 않고, 인터페이스가 클래스의 모든 멤버를 선언한 것과 같습니다.인터페이스는 기본 클래스의 개인 멤버와 보호된 멤버까지 상속합니다.즉, 프라이빗멤버 또는 보호된 멤버로 클래스를 확장하는 인터페이스를 작성할 때 해당 인터페이스 유형은 해당 클래스 또는 그 서브클래스에서만 구현할 수 있습니다.

이 기능은 상속 계층이 크지만 특정 속성을 가진 하위 클래스에서만 코드가 작동하도록 지정하려는 경우에 유용합니다.하위 클래스는 기본 클래스에서 상속하는 것 외에 관련될 필요가 없습니다.예를 들어 다음과 같습니다.

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이 경우는, 인터페이스를 실장하는 것과 같습니다..구현이 되지 않습니다.

타이프스크립트(및 기타 일부 OO 언어)로 된 클래스 및 인터페이스가 있습니다.

인터페이스에는 구현이 없습니다.이 타입의 멤버/메서드의 「계약」일 뿐입니다.
예를 들어 다음과 같습니다.

interface Point {
    x: number;
    y: number;
    distance(other: Point): number;
}

「」를 .Point의 2개의 합니다.「 2 」 。x ★★★★★★★★★★★★★★★★★」y', and one method, 측정, which receives another instance and returns a번호를 지정합니다.
인터페이스는 이들 중 어느 것도 구현하지 않습니다.

클래스는 다음과 같은 구현입니다.

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' 유형에 Property' name'이 없습니다.

그 이유는 인터페이스가 구현되어 있지 않기 때문입니다.
만약에 implement클래스에서는, 실장하지 않고 「계약」만 취득합니다.따라서, 다음의 조작을 실시할 필요가 있습니다.

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

(운동장 코드)

, 「」, 「」라고 하는 은, 「」라고 하는 입니다.extend의 경우 클래스로 분류할 수 있지만, 그렇지 않으면 로 분류할 수 있습니다.implement바로 그거에요.

VS 구현 확장

  • 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 자체에서 모든 것을 구현해야 한다는 것을 알 수 있습니다.

man 클래스에서 예를 들어 walk 메서드를 삭제하면 다음과 같은 컴파일 시간 오류가 발생합니다.

클래스 'man'은 클래스 'Person'을 잘못 구현합니다.'Person'을 확장하여 멤버를 하위 클래스로 상속하겠다는 뜻이었습니까?유형 'man'에는 속성 'walk'가 누락되지만 유형 'Person'에는 필수입니다.(2720)

@nitzan-tomer의 훌륭한 답변!많은 도움이 되었습니다...나는 그의 데모를 조금 확장했다:

IPoint interface;
Point implements IPoint;
Point3D extends Point;

그리고 그들이 어떻게 기능에서 행동하는지IPoint유형.

그래서 지금까지 배운 것은 엄지손가락 법칙으로 사용되었습니다.범용 타입을 필요로 하는 클래스 및 메서드를 사용하고 있는 경우는, 예상되는 타입으로서 인터페이스를 사용합니다.부모 클래스 또는 베이스 클래스가 그 인터페이스를 사용하고 있는 것을 확인합니다.이렇게 하면 인터페이스를 실장하고 있는 한 그 서브클래스의 모든 서브클래스를 사용할 수 있습니다.

확장 데모

기본적으로:

  • extends는 부모 클래스의 모든 속성 및 메서드를 가져옵니다.
  • implements는 인터페이스에 정의된 모든 속성 및 메서드를 구현해야 합니다.
  1. 인터페이스는 쉐이핑으로 인터페이스를 확장합니다.
  2. 인터페이스는 쉐이핑으로 클래스를 확장합니다.
  3. 클래스는 인터페이스에 의해 제공되는 모든 필드를 구현해야 합니다.
  4. 클래스는 모양을 가진 클래스를 구현합니다.
  5. 클래스는 모든 필드로 클래스를 확장합니다.

extends과 유산에 을 두다implements인터페이스 또는 클래스 중 어느 쪽의 제약에 초점을 맞춥니다.

언급URL : https://stackoverflow.com/questions/38834625/whats-the-difference-between-extends-and-implements-in-typescript

반응형