接口和抽象类的区别
抽象方法和接口的区别
抽象方法和接口的区别
抽象方法和接口是面向对象编程中的两个重要概念,它们之间存在以下区别:
1. 定义方式:抽象方法是在抽象类中定义的方法,使用关键字abstract修饰,没有方法体;接口是由方法签名组成的集合,使用关键字interface进行定义。
2. 继承关系:抽象方法通过继承的方式实现子类对该方法的重写,一个类只能继承一个抽象类;接口通过实现的方式实现对接口中方法的定义,一个类可以实现多个接口。
3. 状态:抽象方法可以有非抽象方法和属性,并可以包含构造函数,一个抽象类可以有自己的状态;接口只能包含抽象方法和常量,没有自己的状态。
4. 实例化:抽象方法不能直接被实例化,需要通过子类继承和重写来实现;接口不能被实例化,但可以通过实现类实例化,使用接口引用来调用实现类的方法。
5. 使用场景:抽象方法适用于需要有默认实现和状态的情况,可以用作基类从而提供一些共享的实现;接口适用于需要强制与不同类之间进行某种逻辑上的约束的情况。
总结来说,抽象方法提供了一种非强制性的基类实现,而接口则是一种强制性的实现规范。抽象方法更强调类的继承和共享实现,接口更强调类的多态和实现规范。
Java中抽象类与接口的比较
能被实例化 的 ,更重要 的是接 口中的 方法都是抽 象的 ,这 些方法 要到实现
器的软 件 ,会发现 问题 领域 存在着笛 这个接 口的类中去实现 。接 口的本 质 子 、古筝等一些具体概 念 ,它们是不 是在 ca ss lse 之间建立起一个协议 ,它 同的 ,但都属于乐 器,这里的乐器就
对象设计思想来看 ,复用的重点应该
是 抽象层的复用 ,而不是具体 某个代 码块的复用。J v a a抽象类和接 I代表 E I 的就是 抽象类型 ,是我 们需要 提出的 抽象层的具体表 现 。二者作为实现抽 象层定义的两种重要机制具有很大的相 似性 ,但在实际应用中 又有本 质的 区
别 。
维普资讯 http://www.cqvip.com
中国科技信息 20 年第 4 07 期
C I CEC N EH O O Y IF A IN Fb20 HN S I EA D TCN LG NC TO e. 7 A N  ̄ 0
J v 中抽象类与接 口的比较 aa
王佳欣 ’ 邢丽 方宪哲 。 1天津工业 大学计算机与 自动化 学院 .
2. 黑龙 江 农业 工程 职 业 学院 1 0 8 5 08
6 0 6 0 1O
5 天津共创科枝 发展有限公 司 3 09 , 011
1抽象类与接口的概念
接口和抽象类的区别
接口和抽象类的区别.txt人生重要的不是所站的位置,而是所朝的方向。不要用自己的需求去衡量别人的给予,否则永远是抱怨。3.1 相同点都不能被直接实例化,都可以通过继承实现其抽象方法。都是面向抽象编程的技术基础,实现了诸多的设计模式。3.2 不同点接口支持多继承;抽象类不能实现多继承。接口只能定义抽象规则;抽象类既可以定义规则,还可能提供已实现的成员。接口是一组行为规范;抽象类是一个不完全的类,着重族的概念。接口可以用于支持回调;抽象类不能实现回调,因为继承不支持。接口只包含方法、属性、索引器、事件的签名,但不能定义字段和包含实现的方法;抽象类可以定义字段、属性、包含有实现的方法。接口可以作用于值类型和引用类型;抽象类只能作用于引用类型。例如,Struct就可以继承接口,而不能继承类。通过相同与不同的比较,我们只能说接口和抽象类,各有所长,但无优略。在实际的编程实践中,我们要视具体情况来酌情量才,但是以下的经验和积累,或许能给大家一些启示,除了我的一些积累之外,很多都来源于经典,我相信经得起考验。所以在规则与场合中,我们学习这些经典,最重要的是学以致用,当然我将以一家之言博大家之笑,看官请继续。3.3 规则与场合请记住,面向对象思想的一个最重要的原则就是:面向接口编程。借助接口和抽象类,23个设计模式中的很多思想被巧妙的实现了,我认为其精髓简单说来就是:面向抽象编程。抽象类应主要用于关系密切的对象,而接口最适合为不相关的类提供通用功能。接口着重于CAN-DO关系类型,而抽象类则偏重于IS-A式的关系;接口多定义对象的行为;抽象类多定义对象的属性;接口定义可以使用public、protected、internal 和private修饰符,但是几乎所有的接口都定义为public,原因就不必多说了。“接口不变”,是应该考虑的重要因素。所以,在由接口增加扩展时,应该增加新的接口,而不能更改现有接口。尽量将接口设计成功能单一的功能块,以.NET Framework为例,IDisposable、IDisposable、IComparable、IEquatable、IEnumerable等都只包含一个公共方法。接口名称前面的大写字母“I”是一个约定,正如字段名以下划线开头一样,请坚持这些原则。在接口中,所有的方法都默认为public。如果预计会出现版本问题,可以创建“抽象类”。例如,创建了狗(Dog)、鸡(Chicken)和鸭(Duck),那么应该考虑抽象出动物(Animal)来应对以后可能出现风马牛的事情。而
接口和抽象类的区别和作用(功能、用途、好处)
接⼝和抽象类的区别和作⽤(功能、⽤途、好处)
接⼝:
抽象类和接⼝亲兄弟,但是有嫡出庶出的区别
总结了4点接⼝存在的意义:
1、重要性:在Java语⾔中, abstract class 和interface 是⽀持抽象类定义的两种机制。正是由于这两种机制的存在,才赋予了Java强⼤的⾯向对象能⼒。
2、简单、规范性:如果⼀个项⽬⽐较庞⼤,那么就需要⼀个能理清所有业务的架构师来定义⼀些主要的接⼝,这些接⼝不仅告诉开发⼈员你需要实现那些业务,⽽且也将命名规范限制住了(防⽌⼀些开发⼈员随便命名导致别的程序员⽆法看明⽩
3、维护、拓展性:⽐如你要做⼀个画板程序,其中⾥⾯有⼀个⾯板类,主要负责绘画功能,然后你就这样定义了这个类。
可是在不久将来,你突然发现这个类满⾜不了你了,然后你⼜要重新设计这个类,更糟糕是你可能要放弃这个类,那么其他地⽅可能有引⽤他,这样修改起来很⿇烦。
如果你⼀开始定义⼀个接⼝,把绘制功能放在接⼝⾥,然后定义类时实现这个接⼝,然后你只要⽤这个接⼝去引⽤实现它的类就⾏了,以后要换的话只不过是引⽤另⼀个类⽽已,这样就达到维护、拓展的⽅便性。
4、安全、严密性:接⼝是实现软件松耦合的重要⼿段,它描叙了系统对外的所有服务,⽽不涉及任何具体的实现细节。这样就⽐较安全、严密⼀些(⼀般软件服务商考虑的⽐较多)。
那么什么是接⼝呢?
接⼝是⼀种能⼒
1:接⼝的命名规则与类型不同。如果修饰符是public。则该接⼝在整个项⽬中可见,如果省略修饰符则该接⼝只能在该包可见
2:接⼝中可以定义常量,不能定义变量,接⼝中的属性都会⾃动⽤public static final修饰,即接⼝中的属性都是全局静态常量,接⼝中的常量必须在定义时指定初始值
Python中的面向对象编程的抽象类和接口
Python中的面向对象编程的抽象类和接口Python是一门非常具有灵活性和可扩展性的编程语言,广泛用于数据科学、人工智能、Web开发等各种领域。在Python中,面向对象编程(Object-Oriented Programming, OOP)是一种非常重要的编程方法,有助于提高代码的可维护性和可读性。在OOP中,抽象类和接口是两个非常重要的概念,它们可以帮助程序员更好地组织代码和规范接口,使代码更加健壮和可靠。
一、抽象类
抽象类是一种特殊的类,它不能直接被实例化,只能被继承。抽象类的主要作用是定义一些抽象方法,这些方法只有方法名和参数列表,没有方法体。因此,抽象类不能被直接调用,只有被子类继承并实现了其中的抽象方法才能被使用。
抽象类的语法如下:
```
from abc import ABC, abstractmethod
class AbstractClass(ABC):
@abstractmethod
def abstract_method(self):
pass
```
这里使用了Python自带的abc模块,其中ABC是一个元类,用于
定义抽象类。抽象方法通过@abstractmethod注解来声明,方法体留空,由子类实现。如果子类没有实现抽象方法,那么会在运行时抛出TypeError异常。
抽象类的主要作用是规范代码的结构,避免子类实现不完整或不
规范的情况。抽象类定义了一些抽象方法,规定了子类必须实现的方法,从而保证了程序的正确性和可维护性。
二、接口
接口和抽象类类似,也是一种规范,但是接口更为严格和简洁。
java abstract类命名
java abstract类命名
摘要:
1.Java抽象类概述
2.抽象类的特点
3.抽象类与接口的区别
4.抽象类的应用案例
5.命名规范与建议
正文:
Java抽象类是一种不能实例化的类,它包含一个或多个抽象方法。抽象方法是没有方法体的方法,需要子类提供具体实现。抽象类的主要目的是规定子类的接口,实现代码的复用。
抽象类的特点主要有以下几点:
1.抽象类不能被实例化。
2.抽象类至少包含一个抽象方法。
3.抽象类可以包含普通方法和字段。
4.抽象类不能包含构造方法。
5.抽象类不能被继承,但可以被实现。
抽象类与接口的区别主要体现在以下几个方面:
1.抽象类可以包含普通方法和字段,而接口只能包含方法定义。
2.抽象类中的方法可以有不同的访问权限,而接口中的方法都是public 的。
3.抽象类可以有构造方法,而接口不能。
4.抽象类中的方法可以有默认实现,而接口中的方法没有默认实现。
5.实现类可以同时实现多个接口,但只能继承一个抽象类。
抽象类的应用案例包括:
1.模板方法模式:通过定义一个抽象类,将算法的结构和共享功能定义在该抽象类中,而将具体的实现留给子类。
2.工厂方法模式:通过定义一个抽象类,声明创建对象的方法,具体创建过程由子类决定。
3.适配器模式:通过定义一个抽象类,将原本接口不兼容的类转换成可以相互通信的类型。
在命名方面,抽象类通常以"Abstract"作为前缀,以表明它是一个抽象类。此外,建议遵循驼峰命名法,将抽象方法命名为"abstractMethod",以与其他方法区分开来。
总之,Java抽象类是一种非常有用的编程概念,它可以帮助我们更好地实现代码复用和提高代码的可维护性。
抽象类和接口的相同和异同点
抽象类和接口的相同和异同点
声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。
接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。
在编写对象的时候会对一些类的方法进行定义。但是并没有具体的实现。而是把它们放到子类中去实现,具有灵活性。在抽象类中可以有抽象方法,也可以没有抽象方法。但是有了抽象方法的类一定是抽象类。
抽象类和接口在JA V A中都是用来表述抽象类的。
在面向对象的概念,所以的对象都是通过类来描述的。但反之则不行。若是一个类中没有包含足够的信息描绘一个具体的对象,这个的类就是抽象类。
在JA V A中除了使用抽象类来实现一定程度的抽象外还可以定义一种特殊的抽象方法----接口(interface)。和抽象类的方法不一样,在抽象类中需要加上关键字abstract来表明某个方法是抽象的,但是在接口中则不需要。
相同点:
1.他们都能不能生成实例,都有抽象方法。
2接口是特殊的抽象类。
3.接口和抽象类的继承都使用的关键字是extends。
不同点:
1.接口的定义的变量默认是public static final型,且必须给其赋初值。所以在实现类中不能重新定义,也不能改变其值。而在抽象类中其值在子类中可以重新定义也可以重新赋值。
接口和抽象类的区别是什么?Java接口中声明的变量默认都是final的。(为什么)
接⼝和抽象类的区别是什么?Java接⼝中声明的变量默认都是final的。(为什
么)
接⼝和抽象类的区别是什么?
参考答案
Java提供和⽀持创建抽象类和接⼝。它们的实现有共同点,不同点在于:
接⼝中所有的⽅法隐含的都是抽象的。⽽抽象类则可以同时包含抽象和⾮抽象的⽅法。
类可以实现很多个接⼝,但是只能继承⼀个抽象类
类可以不实现抽象类和接⼝声明的所有⽅法,当然,在这种情况下,类也必须得声明成是抽象的。
抽象类可以在不提供接⼝⽅法实现的情况下实现接⼝。?
Java接⼝中声明的变量默认都是final的。(为什么)抽象类可以包含⾮final的变量。
Java接⼝中的成员函数默认是public的。抽象类的成员函数可以是private,protected或者是public。
接⼝是绝对抽象的,不可以被实例化。抽象类也不可以被实例化,但是,如果它包含main⽅法的话是可以被调⽤的。
也可以参考JDK8中抽象类和接⼝的区别
问题1.Java接⼝中声明的变量默认都是final的。(为什么)
interface中的变量是当作常量来设计的,它不但是final,⽽且还是public static的,也即interface中的变量⼀定是public static final的,换⾔之,这个变量实际上已经是个“常量”。
解答:java接⼝中成员变量必须是final类型的原因如下:
1. 接⼝中的数据对所有实现类只有⼀份,所以是static
2.要使实现类为了向上转型成功,所以必须是final的.这个举例⼦很好理解.⽐如接⼝A,A有变量value.实现类A1,A2,可以向上转型.假如代码中有⼀句:
第15次 第4章 抽象类、接口、包+第5章 异常处理
} A) i=0 B) i=10 C) 程序有编译(biānyì)错误
D) i=true
精品PPT
15
精品PPT
课堂练习
3.下面程序运行的结果是 。
interface InterfaceA{ String s="good ";
void f(); }
class ClassA implements InterfaceA{
public void f(){ System.out.print(s); }
5
精品PPT
Employee实现(shíxiàn)Comparable 接口
public class Employee implements Comparable{
private String name;
//姓名
private double salary;
//工资(gōngzī)
private String department; //部门
25
精品PPT
setPlayer
public void setPlayer(int starter) //指定从哪位选手 (xuǎnshǒu)开始
抽象类和接口的区别
抽象类和接口的区别
对于面向对象编程来说,抽象是它的一大特征之一。在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类。这两者有太多相似的地方,又有太多不同的地方。下面是为大家准备的抽象类和接口的区别,希望大家喜欢!
抽象类和接口的相关知识
一.抽象类
在了解抽象类之前,先来了解一下抽象方法。抽象方法是一种特殊的方法:它只有声明,而没有具体的实现。抽象方法的声明格式为:1abstract void fun();
抽象方法必须用abstract关键字进行修饰。如果一个类含有抽象方法,则称这个类为抽象类,抽象类必须在类前用abstract关键字修饰。因为抽象类中含有无具体实现的方法,所以不能用抽象类创建对象。
下面要注意一个问题:在《JAVA编程思想》一书中,将抽象类定义为“包含抽象方法的类”,但是后面发现如果一个类不包含抽象方法,只是用abstract修饰的话也是抽象类。也就是说抽象类不一定必须含有抽象方法。个人觉得这个属于钻牛角尖的问题吧,因为如果一个抽象类不包含任何抽象方法,为何还要设计为抽象类?所以暂且记住这个概念吧,不必去深究为什么。
1
2
3[public] abstract class ClassName {
abstract void fun();
}
从这里可以看出,抽象类就是为了继承而存在的,如果你定义了一个抽象类,却不去继承它,那么等于白白创建了这个抽象类,因为你不能用它来做任何事情。对于一个父类,如果它的某个方法在父类中实现出来没有任何意义,必须根据子类的实际需求来进行不同的实现,那么就可以将这个方法声明为abstract方法,此时这个类也就成为abstract类了。
2021年软件技术 4-2-1 4.接口之接口与抽象类的异同
; ; }
第四页,共六页。
谢谢观看
第五页,共六页。
内容总结
接口之接口与抽象类的异同。2〕接口中为函数型方法,抽象类中为抽象方法。1〕派生类只能有 一个父类,但可以有继承多个接口。2〕接口中不能包含字段、构造函数、析构函数、静态成员或常量 ,抽象类中可以。} //定义接口中的属性型。//定义接口中的方法型。//定义字段。public string plate。// 访问接口对象的属性。//调用接口对象的方法。} }。谢谢观看
3〕接口中的成员必须为公有的,抽象类中的成员可以为私有的,只是抽象方法必须为公有的。
第一页,共六页。
接口之接口与抽象类的异同
接口例子:
interface IPasstrain //定义接口
{
int Weight { get; set; } //定义接口中的属性型
string Plate { get; set; } //定义接口中的属性型
接口之接口与抽象类的异同
接口与抽象类的异同
接口与抽象类的相似性:
1〕都可以包含有由派生类来实现的成员,且都不能被实例化。 2〕接口中为函数型方法,抽象类中为抽象方法。
接口与抽象类的区别: 1〕派生类只能有一个父类,但可以有继承多个接口。
2〕接口中不能包含字段、构造函数、析构函数、静态成员或常量,抽象类中可以。
抽象类与接口之间的区别
在 abstract class 方式中,Demo 可以有自己的数据成员,也可以有非 abstarct 的成员方法,而在 interface 方式的 实现中,Demo 只能够有静态的 不能被修改的数据成员(也就是必须是 static final 的,不过在 interface 中一般不定 义数据成员),所有的成员方法都是 abstract 的。从某种意义上说,interface 是一种特殊 形式的 abstract class。
其实,两者之间还是有很大的区别的,对于它们的选择甚至反映出对于问题领域本质的理解、对于设计意图的理解是否 正确、合理。本文将对它们之间的区别进行一番剖析,试图给开发者提供一个在二者之间进行选择的依据。
一、理解抽象类 广义的抽象类用于提取抽象概念 广义的抽象类用于封装隐藏
abstract class 和 interface 在 Java 语言中都是用来进行抽象类(本文中的抽象类并非从 abstract class 翻译而来, 它表示的是一个抽象体,而 abstract class 为 Java 语言中用于定义抽象类的一种方法,请读者注意区分)定义的,那 么什么是抽象类,使用抽象类能为我们带来什么好处呢?
二、从语法定义层面看 abstract class 和 interface
在语法层面,Java 语言对于 abstract class 和 interface 给出了不同的定义方式,下面以定义一个名为 Demo 的抽象 类为例来说明这种不同。使用 abstract class 的方式定义 Demo 抽象类的方式如下:
接口和抽象类有什么区别
接⼝和抽象类有什么区别
他们都不能实例化对象,都可以包含抽象⽅法,⽽且抽象⽅法必须被继承的类全部实现。
区别:
1、抽象类和接⼝都不能直接实例化,如果要实例化,抽象类变量必须指向实现所有抽象⽅法的⼦类对象,接⼝变量必须指向实现所有接⼝⽅法的类对象。
2、抽象类要被⼦类继承,接⼝要被类实现。
3、接⼝只能做⽅法申明,抽象类中可以做⽅法申明,也可以做⽅法实现
4、接⼝⾥定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。
5、抽象类⾥的抽象⽅法必须全部被⼦类所实现,如果⼦类不能全部实现⽗类抽象⽅法,那么该⼦类只能是抽象类。同样,⼀个实现接⼝的时候,如不能全部实现接⼝⽅法,那么该类也只能为抽象类。
6、抽象⽅法只能申明,不能实现,接⼝是设计的结果,抽象类是重构的结果
7、抽象类⾥可以没有抽象⽅法
8、如果⼀个类⾥有抽象⽅法,那么这个类只能是抽象类
9、抽象⽅法要被实现,所以不能是静态的,也不能是私有的。
10、接⼝可继承接⼝,并可多继承接⼝,但类只能单根继承。
参数抽象类接⼝
默认的⽅法实
现
它可以有默认的⽅法实现接⼝完全是抽象的。它根本不存在⽅法的实现
实现
⼦类使⽤extends关键字来继承抽象类。如果⼦类不
是抽象类的话,它需要提供抽象类中所有声明的⽅法的实现。⼦类使⽤关键字implements来实现接⼝。它需要提供接⼝中所有声明的⽅法的实现
构造器抽象类可以有构造器接⼝不能有构造器
与正常Java类
的区别
除了你不能实例化抽象类之外,它和普通Java类没有任何区别接⼝是完全不同的类型
访问修饰符抽象⽅法可以有public、protected和default这些修饰符接⼝⽅法默认修饰符是public。你不可以使⽤其它修饰符。
Java中抽象类和接口的区别与联系
1 类( A S) CL S
在所 以面向对 象 (bet ojc)的程序设 计 语言 的概 念
中 , (ls) 同 一类 型 事物 数 据 的抽 象 , 类 c s是 a 是对 象 共 性 的抽 象 , 客观对 象 在 人脑 中的 主观 反 映 , 一种 抽 象 是 是
些 方法 特征 的集合 ,一 个接 口只有 方 法 的特 征 没有
的类实 现 , 而这些 实 现可 以具 有不 同的功能 。接 口的作
方 法 的实 现 ,因此这 些 方 法可 以在不 同的地 方 被不 同 用 是实 现多 继承 , 只是 接 口的一 部分 功能 。接 口是一 这 个 类 的附 加信 息 ,接 口的多继 承 是不 会 破坏 类 的单 继 承 的 。一个 类 的父类 与 该类 实 现 的接 口并不 在 同一 个
制。 正是 由于这两种不 同机制 的存在 , 使得 Jv 具有强大的功能。抽象类(b ̄ c c s) aa a satl s 和接 口( t ae ) a i e cs之间在对于抽象 nr f 类定义 的支持方面具有很 大的相似性 , 甚至可 以相互替换。其实 , 两者之间还是有很大的区别的 , 对于它们的选择甚至反映 出对于 问题领域本质的理解 、 对于设计意图的理解是否正确 、 合理 。本论述将对它们之间的区别进行一番剖析 , 以便让设计 人员对二者在使用 时有 比较 明确 的抉择 , 以利于程序 的流畅执行 。
interface和abstract的区别
interface和abstract的区别
抽象类(abstract)
含有abstract修饰符的class即为抽象类,abstract 类不能创建的实例对象。
含有abstract⽅法的类必须定义为abstract class,abstract class类中的⽅法不必是抽象的。
abstract class类中定义抽象⽅法必须在具体(Concrete)⼦类中实现,所以,不能有抽象构造⽅法或抽象静态⽅法。
如果的⼦类没有实现抽象⽗类中的所有抽象⽅法,那么⼦类也必须定义为abstract类型。
接⼝(interface)
interface 可以说成是抽象类的⼀种特例,接⼝中的所有⽅法都必须是抽象的。
接⼝中的⽅法定义默认为public abstract类型,接⼝中的成员变量类型默认为public static final。
下⾯⽐较⼀下两者的语法区别:
1.抽象类可以有构造⽅法,接⼝中不能有构造⽅法。
2.抽象类中可以有普通成员变量,接⼝中没有普通成员变量
3.抽象类中可以包含⾮抽象的普通⽅法,接⼝中的所有⽅法必须都是抽象的,不能有⾮抽象的普通⽅法。
4. 抽象类中的抽象⽅法的访问类型可以是public,protected和(默认类型,虽然eclipse下不报错,但应该也不⾏),但接⼝中的抽象⽅法只能是public类型的,并且默认即为public abstract类型。
5. 抽象类中可以包含静态⽅法,接⼝中不能包含静态⽅法
6. 抽象类和接⼝中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接⼝中定义的变量只能是public static final 类型,并且默认即为public static final类型。
接口与抽象类详细分析比较
接口与抽象类
接口(interface)是向客户保证类的行为方式的一种协定(contract)。当类实现某个接口时,相当于告诉客户:“我保证支持这个接口中提出的所有方法、属性、事件、索引器”。
C#如何定义接口?
访问修饰符interface 接口名
{
//没有实现的各种方法签名
}
说明:一般的接口名称,首字母都要以I 开头,如:IFly等。
C#如何实现接口?
举例:public class Duck : IFly
{
public void Fly(){//flying};
}
跟继承一样,在C#中,采用: (冒号)来实现某个接口。
实现多个接口
public class Duck:IFly,IHowl
{
public void Fly(){};
public void Howl(){};
}
在C#中,采用: (冒号)来实现某个接口,如果要实现多个接口,可以用逗号隔开。
扩展接口
public interface IDuckBehavior:IFly
{
void Swim(){};
}
public class Duck:IDuckBehavior
{
…….
}
抽象类与接口的比较
思考一下:我们知道鸭子有很多种,红头鸭、绿头鸭、荷兰鸭等等。这些鸭子都具备飞行的能力,如何设计鸭子类并让所有的鸭子都具备飞行能力呢?
第一种方式:我们考虑使用继承。将Duck类设计成所有鸭子的超类,我们不希望能够直接实例化Duck,因为这种鸭子太不具体了,所以我们把Duck定义为抽象基类:
分析第一种方式,采用抽象基类就避免了直接实例化Duck 而产生一只不明不白的鸭子,同时将Duck类中的Fly方法声明为abstract,又表示所有继承Duck的子类都必须要实现飞行的方
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
.Net提供了接口,这个不同于Class或者Struct的类型定义。接口有些情况,看似和抽象类一样,因此有些人认为在.Net可以完全用接口来替换抽象类。其实不然,接口和抽象类各有长处和缺陷,因此往往在应用当中,两者要结合来使用,从而互补长短。
接下来先说说抽象类和接口的区别。
区别一,两者表达的概念不一样。抽象类是一类事物的高度聚合,那么对于继承抽象类的子类来说,对于抽象类来说,属于“是”的关系;而接口是定义行为规范,因此对于实现接口的子类来说,相对于接口来说,是“行为需要按照接口来完成”。这些听起来有些虚,举个例子。例如,狗是对于所有狗类动物的统称,京哈是狗,牧羊犬是狗,那么狗的一般特性,都会在京哈,牧羊犬中找到,那么狗相对于京哈和牧羊犬来说,就属于这类事物的抽象类型;而对于“叫”这个动作来说,狗可以叫,鸟也可以叫。很明显,前者相当于所说的是抽象类,而后者指的就是接口。
区别二,抽象类在定义类型方法的时候,可以给出方法的实现部分,也可以不给出;而对于接口来说,其中所定义的方法都不能给出实现部分。
例如:
public abstract class AbsTest
{
public virtual void Test()
{
Debug.WriteLine( "Test" );
}
public abstract void NewTest();
}
public interface ITest
{
void Test();
void NewTest();
}
区别三,继承类对于两者所涉及方法的实现是不同的。继承类对于抽象类所定义的抽象方法,可以不用重写,也就是说,可以延用抽象类的方法;而对于接口类所定义的方法或者属性来说,在继承类中必须要给出相应的方法和属性实现。
区别四,在抽象类中,新增一个方法的话,继承类中可以不用作任何处理;而对于接口来说,则需要修改继承类,提供新定义的方法。
知道了两者的区别,再来说说,接口相对于抽象类的优势。
好处一,接口不光可以作用于引用类型,也可以作用于值类型。而抽象类来说,只能作用于引用类型。
好处二,.Net的类型继承只能是单继承的,也就是说一个类型只能继承一个类型,而可以继承多个接口。其实,我对于这一点也比较赞同,多继承会使继承树变的混乱。
好处三,由于接口只是定义属性和方法,而与真正实现的类型没有太大的关系,因此接口可以被多个类型重用。相对于此,抽象类与继承类的关系更紧密些。
好处四,通过接口,可以减少类型暴露的属性和方法,从而便于保护类型对象。当一个实现接口的类型,可能包含其他方法或者属性,但是方法返回的时候,可以返回接口对象,这样调用端,只能通过接口提供的方法或者属性,访问对象的相关元素,这样可以有效保护对象的其他元素。
好处五,减少值类型的拆箱操作。对于Struct定义的值类型数据,当存放集合当中,每当取出来,都需要进行拆箱操作,这时采用Struct+Interface结合的方法,从而降低拆箱操作。
参看如下文章提供的方法。
/Knight94/archive/2006/10/08/1326326.aspx
相对于抽象类来说,接口有这么多好处,但是接口有一个致命的弱点,就是接口所定义的方法和属性只能相对于继承它的类型(除非在继承类中修改借口定义的函数标示),那么对于多层继承关系的时候,光用接口就很难实现。因为如果让每个类型都去继承接口而进行实现的话,首先不说编写代码比较繁琐,有时候执行的结果还是错误,尤其当子类型对象隐式转换成基类对象进行访问的时候。
那么这时候,需要用接口结合虚方法来实现。参看IDisposable在继承类型中的实现方法。
/Knight94/archive/2006/10/10/1329214.aspx
其实在继承中,到底使用接口还是抽象类。接口是固定的,约定俗成的,因此在继承类中必须提供接口相应的方法和属性的实现。而对于抽象类来说,抽象类的定义方法的实现,贯穿整个继承树,因此其中方法的实现或者重写都是不确定的。因此相对而言,抽象类比接口更灵活一些。
如下给出两者的简单对比表格。
接口抽象类
多继承支持不支持
类型限制没有有,只能是引用类型
方法实现继承类型中必须给出方法实现继承类中可以不给出
扩展性比较麻烦相对比较灵活
多层继承比较麻烦,需要借助虚函数比较灵活
总的来说,接口和抽象类是.Net为了更好的实现类型之间继承关系而提供的语言手段,而且两者有些相辅相成的关系。因此我并不强调用什么而不用什么,那么问题的关键在于,如何把这两种手段合理的应用到程序当中,这才是至关重要。