interface和class的区别

本文详细对比了接口与类之间的六项主要区别,包括成员组成、实例化能力、构造函数、运算符重载、成员修饰符及派生实现等方面。
1、接口类似于类,但接口的成员都没有执行方式,它只是方法、属性、事件和索引的组合而已,并且也只能包含这四种成员;类除了这四种成员之外还可以有别的成员(如字段)。
2、不能实例化一个接口,接口只包括成员的签名;而类可以实例化(abstract类除外)。
3、接口没有构造函数,类有构造函数。
4、接口不能进行运算符的重载,类可以进行运算符重载。
5、接口的成员没有任何修饰符,其成员总是公共的,而类的成员则可以有修饰符(如:虚拟或者静态)。
6、派生于接口的类必须实现接口中所有成员的执行方式,而从类派生则不然。
在不同的编程语言中,class(类)interface(接口)存在诸多区别,以下以Java、C#TypeScript为例进行说明: ### Java - **实现与继承**:interface需要用implements实现,而class(这里指abstract class)需要用extends继承;一个类可以实现多个interface,但只能继承一个abstract class [^2]。 - **设计理念**:interface强调特定功能的实现,而abstract class强调所属关系 [^2]。 - **方法实现形式**:interface中的每一个方法都是抽象方法,只有声明没有方法体,实现类必须实现;abstract class中并非所有方法都是抽象的,只有冠有abstract的方法才是抽象的,子类必须实现,没有abstract的方法在abstract class中必须定义方法体。abstract class的子类对非抽象方法既可以直接继承,也可以覆盖;对抽象方法,可以选择实现,也可以再次声明为抽象方法留给其子类实现,但此类必须声明为抽象类 [^2]。 - **成员特点**:interface只能声明public的方法,不能声明private及protected的方法,不能定义方法体,不能声明实例变量,但可以声明常量变量;abstract class可以定义自己的实例变量,供子类继承使用,还可以定义缺省的方法体,供子类直接使用或覆盖 [^2]。 ### C# - **概念本质**:类是对象的具体实现,接口是对类的行为的抽象。接口用于定义标准,类实现接口来遵守标准 [^4]。 - **实例化**:接口不能实例化,必须通过类实例化;类可以实例化(非抽象类) [^4]。 ### TypeScript - **用途**:interface主要用于类型检查,确保对象满足特定的结构。接口不能实例化,只能被实现(implements)或扩展(extends) [^5]。 ### 代码示例 #### Java ```java // 接口 interface MyInterface { void method(); // 抽象方法 } // 抽象类 abstract class MyAbstractClass { abstract void abstractMethod(); void normalMethod() { System.out.println("This is a normal method."); } } // 实现类 class MyClass extends MyAbstractClass implements MyInterface { @Override public void method() { System.out.println("Implementing interface method."); } @Override void abstractMethod() { System.out.println("Implementing abstract method."); } } ``` #### C# ```csharp // 接口 public interface IShape { void Draw(); } // 类 public class Circle : IShape { public void Draw() { Console.WriteLine("画一个圆形"); } public double Radius { get; set; } public Circle(double r) { Radius = r; } } ``` #### TypeScript ```typescript // 接口 interface Person { name: string; age: number; greet(): void; } // 类 class MyPerson implements Person { name: string; age: number; constructor(name: string, age: number) { this.name = name; this.age = age; } greet() { console.log(`Hello, my name is ${this.name} and I'm ${this.age} years old.`); } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值