序言:正在看了ts中抽象类和接口的基本知识点以后,他好像们的用法特别像,第一步二者全是抽象的界定(个人见解为全是重新定义了一个”磨具“,再根据这一”磨具“去结构可利用的实体线),需要实体,但是比起插口而言,内部类也不完全就是抽象化界定的,能够存有实体线组员。下边从他们这个概念,词法,特点来分析二者的差别。
1.内部类
内部类(Abstract Class)
是类的一种;内部类是供其他类别传承的父类,不可以被创建对象。内部类里的抽象化组员必须要在派生类里被完成。
板栗-内部类的应用
// 界定内部类
abstract class Shape {
abstract shape_name: string; // 抽象化特性
abstract calArea(): number; // 抽象方法
desShape(): string{ // 实体线方式
return `This is ${this.shape_name}`;
}
}
class Rectangle extends Shape {
shape_name: string; // 完成抽象化特性
shape_width: number = 20;
shape_height: number = 20;
constructor(name: string, width: number, height: number) {
super();
this.shape_name = name;
this.shape_width = width;
this.shape_height = height;
}
// 完成抽象方法
calArea(): number {
return this.shape_width * this.shape_height;
}
// 重新写过基类的方法
desShape(): string{
return `这是一个${this.shape_name}, 面积约${this.calArea()} `
}
}
let rectangle: Rectangle | Shape;
rectangle = new Rectangle('方形', 30, 30);
rectangle.desShape(); // 这是一个方形, 面积约900
编码中最先重新定义了 Shape 内部类,包括了抽象化组员(shape_name、calArea)和实体线方式 desShape,随后重新定义了派生类 Rectangle 传承 Shape 内部类,此类务必需要对成员变量里的 shape_name、calArea 实际完成,并拓展已有特性及其重新写过了实体线方式 desShape。抽象方法可针对不同的派生类有着不同的完成(和接头中界定的方式相近)。
抽象化类的特性:
-
应用
abstract
关键词界定内部类及组员(特性、方式),也就是说,应用 abstract 界定的类即是内部类(不管是不是存有抽象化组员); -
抽象化特性和抽象方法只会在内部类里才存有,不可以在常规dao层中应用 abstract 来定义抽象化组员;
-
带有申明但并未完成的办法(还可以包括已经实现的办法),抽象化特性不能初始化,内部类更加是难以被创建对象;
-
在内部类中能够界定存储器(getter/setter);
-
派生类务必完成内部类(父类)中每一个抽象化组员,不然会编译错误;
-
实例对象在证明时可以用抽象化目标做为变量的引入(种类);
-
内部类仅支持单继承。
class A extends B,C
这种方法肯定是不行的,尽管类只有单继承,可是能通过 class A {}, class B extends A {}, class C extends B {}
这种方法仿真模拟完成多层次传承
abstract class GrandFather {
abstract money: string;
}
abstract class Father extends GrandFather {
money: string = '¥100,0000';
abstract house: string;
}
class Child extends Father {
house: string = '4幢';
}
2.插口
插口(interface)
应该是对象情况(特性)与行为(方式)的描写(抽象化),还可以称为对种类的一种管束(类也是一种种类),插口一般用于叙述的是:字面量种类、二维数组数组种类、函数类型、类种类、对象类型等。
板栗-接口应用
// 管束数组类型、数组种类和长短
interface MyArray {
[index: number]: string;
length: string;
}
let myArray: MyArray = ['hello', 'world'];
console.log(myArray.length); // 2
interface MyTuple {
0: string;
1: number;
2: boolean;
}
let myTuple: MyTuple = ['hello', 233, true];
// 管束目标组员(字段名)
interface Student {
name: string;
studentNum: number;
age: number;
className: string;
}
// 界定学生们结合
let students: Array<Student> = [
{ name:"小丽", studentNum:16310120815, age: 18, className:'高二8班' },
{ name:"小亮", studentNum:16310120711, age: 20, className:'高二7班' },
{ name:"小丽", studentNum:16310120718, age: 19, className:'高二7班' }
];
// 接口传承
interface Alarm {
type: string;
}
interface Arguments {
color: string;
price: number;
}
interface Car extends Alarm, Arguments {
name: string;
}
let c: Car = { name:'BYD', color:'white', price:150000, type:'autoalarm' };
// 类实现接口
interface Animal {
name: string;
yelp(): void;
}
interface Sing {
action(): void;
}
class Dog implements Animal, Sing {
name: string = '黄连';
color: string = 'yellow';
action(): void {
console.log('sing...')
}
yelp(): void {
console.log('yelp...')
}
}
let dog = new Dog();
dog.action();
dog.yelp();
接口特点:
- 接口组员包括特性、方法与检索签字;
- 不能被创建对象;
- 带有申明但并未完成的办法;
- 一个类能够实现好几个插口,插口适用多继承;
- 插口中界定中的一员务必想要实现;
- 插口中每一个组员默认public;
3.汇总
相同之处:接口和抽象类都表示是抽象的物品,无法被创建对象(new),有同样的特性修饰符 readOnly
;
不同之处:
-
插口应用
interface
关键词申明,内部类应用abstract
申明(类及组员); -
插口里只有
readOnly
修饰符,内部类含有public、private、protected、readOnly
修饰符; -
插口能够支持多继承;类仅支持单继承;
-
插口里的组员全是抽象的,而内部类里的组员并不一定,仅有应用
abstract
说明的才算是; -
在可扩展性领域,插口相对来说固定不动,只能依靠增加更多的插口来拓展;而内部类还可以在派生类上对内部类中不可能的特性或方式进行拓展;
-
插口是绝对不在乎方式的如何做到,而内部类某个抽象方法根据不同的派生类完成不一样的功效。
以上是个人见解,有不恰当地区热烈欢迎强调。
本站是一个以CSS、JavaScript、Vue、HTML为中心的前端开发技术网址。我们的使命是为众多前端工程师者提供全方位、全方位、好用的前端工程师专业知识和技术服务。 在网站上,大家可以学到最新前端开发技术,掌握前端工程师最新发布的趋势和良好实践。大家提供大量实例教程和实例,让大家可以快速上手前端工程师的关键技术和程序。 本站还提供了一系列好用的工具软件,帮助你更高效地开展前端工程师工作中。公司提供的一种手段和软件都要经过精心策划和改进,能够帮助你节约时间精力,提高研发效率。 此外,本站还拥有一个有活力的小区,你可以在社区里与其它前端工程师者沟通交流技术性、交流经验、处理问题。我们坚信,街道的能量能够帮助你能够更好地进步与成长。 在网站上,大家可以寻找你需要的一切前端工程师网络资源,使您成为一名更加出色的网页开发者。欢迎你添加我们的大家庭,一起探索前端工程师的无限潜能!