面向接口、面向对象;接口、抽象类的理解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sunshineyang1205/article/details/78872426

我有一个梦想,是改变世界,这是很多技术人员的梦想;从小事做起,踏实做人做事,当身边的人或事因为自己能像更好的方向改变或发展的时候,那就是在改变世界,至花甲之时,可能我的梦想也无法实现,但我会一直追逐着他前行。我相信蝴蝶效应。荣耀的背后可这一道孤独。

面向接口编程(IOP:Interface Oriented Programming)
面向对象编程(OOP:Object Oriented Programming)

面向接口编程
在一个系统中,系统中的各个功能或业务都是由不同的对象协作完成的,各个对象中的具体实现对于软件设计人员(软件设计是从软件结构、组成、架构等方面来进行设计)来讲并不重要,他关心的是各个对象之间的通信,小到类之间的交互,大到模块功能之间的交互;不是简单意义上的代码角度的思维,而是一种架构、软件结构的思维,他强调的是低耦合,结构中的各个层之间不实现具体类的依赖,而是实现接口间的依赖。

面向对象编程
一种计算机编程架构,一个系统是面向对象编程,其系统设计可以使用面向接口编程。
实现:重用性、灵活性、扩展性。(通过面向接口设计软件结构可以很好的实现面向对象思想)
特点:封装、继承、多态。
面向对象包含面向接口,面向对象编程是一种软件架构,面向接口编程是一种软件设计。

接口与抽象类的区别
1. 接口是行为模式的抽象,抽象类是根源的抽象
2. 接口描述的是“能做什么”,抽象类描述的是“是什么”
a. 1.飞机会飞,鸟会飞,他们都继承了同一个接口“飞”;但是F22属于飞机抽象类,鸽子属于鸟抽象类;
b. 2. 就像铁门木门都是门(抽象类),你想要个门我给不了(不能实例化),但我可以给你个具体的铁门或木门(多态);而且只能是门,你不能说它是窗(单继承),一个门可以有锁(接口)也可以有门铃(多实现)。门(抽象类)定义了你是什么,接口(锁)规定了你能做什么(一个接口最好只能做一件事,你不能要求锁也能发出声音吧(接口污染))。
3. 接口是一种契约,主要是在软件设计架构上使用;抽象类在代码实现上发挥作用,可以实现代码的重用。
4. 模板方法设计模式是抽象类的一个典型应用。

抽象类:
1、抽象类不可以被实例化,不能定义构造函数;
2、抽象类可以定义成员变量(私有、公有、静态、非静态等都可以),非抽象方法,
3、拥有抽象方法的类必须是抽象类;
3、抽象类中可以定义虚方法,虚方法必须有方法体,派生类中可以实现或不实现虚方法。派生类中必须实现抽象方法。
4、抽象派生类可以不实现基类的抽象方法。
5、非抽象派生类必须实现所有抽象方法。
6、一个派生类只能继承一个抽象类(因为单继承机制)。

接口:
1、接口不可以被实例化,不能定义构造函数;
2、接口类定义的接口不能有访问修饰符(显示写public也不行,因为接口必须是public的,编译器自动会加上public来实现公开)。
3、接口中只能包含方法声明(即接口),不能定义成员变量。
4、派生类必须实现所有接口声明。
5、一个派生类可以实现多个接口。

抽象类和接口
相同点:
1、都可以被继承。
2、都不能被实例化。
3、都可以包含方法声明。
4、派生类必须实现未实现的方法(除了抽象类中的虚方法)。
区别:
1、抽象类可以定义字段、属性、方法实现。接口只能定义属性、索引器、事件和方法声明。不能包含字段
2、抽象类只能被单一继承,接口可以被多重实现。
3、抽象类被定义在一些紧密相关的类间,接口大多是关系疏松但都实现某一功能的类间(接口强调行为及契约)。
4、抽象类是一系列相关对象中抽象出来概念,反应的是内部共性,接口是满足外部调用而定义的一系列功能契约,反应的是外部特性。
5、如果抽象类实现接口,则可以把接口中的方法(即具体接口)作为抽象方法映射到抽象类中作为抽象方法而不实现,而在抽象类的子类中来实现。

下面的代码示例,体现了行为模式(契约)使用抽象类与接口的区别:
人类。抽象类APerson,定义了吃东西的抽象方法

public abstract class APerson
{
    public void PlayFootbal()
    {
    Console.WriteLine("踢足球");
    }
    public abstract void Eat();
}

中国人。继承人类抽象类,具备了父类的吃东西方法,定义了通过筷子吃东西的抽象方法

public abstract class Chinese : APerson
{
    public abstract void EatByKuaiZi();
}

美国人。继承人类抽象方法,具备了父类的吃东西方法,定义了通过叉子吃东西的抽象方法

public abstract class American : APerson
{
    public abstract void EatByChaZi();
}

法国人。既会使用筷子吃东西,也会使用叉子吃东西,但是无法实现,除非在这里重新自己实现一遍两个方法,或继承中国人或美国人之一,实现其中一个方法,如果用筷子或叉子吃东西是一个很复杂的业务,那么都已经经过测试,这里自己再重新实现一遍,1增加了工作量,2增加了不稳定性。;
注意:继承只能是单继承,是无法多继承的。

public abstract class French : APerson
{
    无法既使用筷子吃东西,也使用叉子吃东西;
}

人类。定义了吃东西接口

public interface IPerson
{
    void Eat();
}

中国人,实现了人类接口,定义了使用筷子吃东西的接口。

public interface IChinese:IPerson
{
    void EatByKuaiZi();
}

美国人。实现了人类接口,定义了使用叉子吃东西的接口。

public interface IAmerican : IPerson
{
    void EatByChaZi();
}

法国人。实现了人类接口、中国人接口、美国人接口,定义了使用手吃东西的接口。
既能用筷子,也能用叉子,还能用手。而使用抽象类是无法实现的。
注意:一个类或接口可以实现多个接口。

public interface French ,IChinese,IAmerican
{
    void EatByHand();
}

抽象类也是一种规则,他的动机是为了实现代码的可复用性

猜你喜欢

转载自blog.csdn.net/sunshineyang1205/article/details/78872426