Gostaria de saber o que o homem e a criança têm em comum e como eles diferem.
class Person {
name: string;
age: number;
}
class child extends Person {}
class man implements Person {}
typescript
extends
implements
Davejoem
fonte
fonte
Respostas:
Versão curta
extends
significa:A nova classe é uma criança . Ele obtém benefícios provenientes da herança. Ele tem todas as propriedades e métodos como pai. Ele pode sobrescrever alguns deles e implementar novos, mas o material pai já está incluído.
implements
significa:A nova classe pode ser tratada como a mesma "forma" , embora não seja uma criança . Pode ser passado para qualquer método em que
Person
seja necessário, independentemente de ter um pai diferentePerson
Mais ...
Em OOP (linguagens como C #, Java) , usaríamos
extends
lucrar com a herança (ver wiki ). Citação pequena:implements
será mais para polimorfismo (veja wiki ). Citação pequena:Portanto, podemos ter uma árvore de herança realmente diferente da nossa
class Man
.mas se também declararmos que podemos fingir ser um tipo diferente -
Person
:.. então podemos usá-lo em qualquer lugar, onde
Person
for necessário. Nós apenas temos que cumprir as Pessoas"interface"
(ou seja, implementar todas as suas coisas públicas) .implement
outra classe? Isso é muito legalA cara legal do Javascript (um dos benefícios) é o suporte integrado à digitação Duck ( consulte a wiki ). Citação pequena:
Então, em Javascript, se dois objetos diferentes ... tivessem um método semelhante (por exemplo
render()
), eles podem ser passados para uma função que o espera:Para não perder isso - podemos fazer o mesmo em Typescript - com mais suporte de digitação. E é aí que
tem seu papel, onde faz sentido
Em linguagens OOP como
C#
... nenhuma maneira de fazer isso ...Além disso, a documentação deve ajudar aqui:
Por enquanto
extends
significa - obtém tudo de seu paiimplements
neste caso, é quase como implementar uma interface. O objeto filho pode fingir que é pai ... mas não obtém nenhuma implementaçãofonte
extends
- obtém tudo de seu pai", isso se aplica a membros privados? Por exemploclass Person {private name: string} class man extends Person{gender: string;}
,man
tem o nome da propriedade?Em typescript (e em algumas outras linguagens OO), você tem classes e interfaces.
Uma interface não tem implementação, é apenas um "contrato" de quais membros / método esse tipo possui.
Por exemplo:
As instâncias que implementam esta
Point
interface devem ter dois membros do tipo number:x
andy
, e um métododistance
que recebe outraPoint
instância e retorna anumber
.A interface não implementa nenhum desses.
As classes são as implementações:
( código no playground )
Em seu exemplo, você trata sua
Person
classe uma vez como uma classe ao estendê-la e uma vez como uma interface ao implementá-la.Seu código:
Tem um erro de compilação dizendo:
E isso porque as interfaces carecem de implementação.
Então, se você
implement
uma classe, você apenas pega seu "contrato" sem a implementação, então você precisará fazer isso:( código no playground )
O ponto principal é que, na maioria dos casos, você deseja
extend
outra classe e nãoimplement
ela.fonte
Ótima resposta de @nitzan-tomer! Me ajudou muito ... Eu estendi um pouco sua demonstração com:
E como eles se comportam em funções que esperam um
IPoint
tipo.Portanto, o que aprendi até agora e tenho usado como regra geral: se você estiver usando classes e métodos que esperam tipos genéricos, use interfaces como os tipos esperados. E certifique-se de que o pai ou a classe base usa essa interface. Dessa forma, você pode usar todas as subclasses daquelas, na medida em que implementam a interface.
Aqui está a demonstração estendida
fonte
extends
foco em herdar eimplements
foco na restrição sejam interfaces ou classes.fonte
Estende implementos VS
extends
: A classe filha (que é estendida) herdará todas as propriedades e métodos da classe é extendsimplements
: A classe que usa aimplements
palavra - chave precisará implementar todas as propriedades e métodos da classe que elaimplements
Para colocar em termos mais simples:
extends
: Aqui você obtém todos esses métodos / propriedades da classe pai para que não precise implementá-los sozinhoimplements
: Aqui está um contrato que a turma deve seguir. A classe deve implementar pelo menos os seguintes métodos / propriedadesExemplo:
No exemplo, podemos observar que a classe filha herda tudo de Person, enquanto a classe man tem que implementar tudo da própria Person.
Se tivéssemos de remover algo da classe man, por exemplo, o método walk, obteríamos o seguinte erro de tempo de compilação :
fonte