我们都知道虚方法实现多态,抽象方法实现多态等,我们今天来看看如何使用接口实现多态

1.首先我们先要来了解了解什么是接口,它存在的意识

01.接口就是为了约束方法的格式(参数和返回值类型)而存在的

02.接口可以实现多继承,弥补单继承的缺陷。

  03.接口可以看成是一个特殊的抽象类,通过反编译看源码可知

04.接口中方法不用访问修饰符,因为CLR会自动添加,并且不能有方法体

05.如果一个类实现了某个接口,就得实现该接口中所有的方法

06.接口要谨慎使用,防止出现接口污染!

07.接口仅仅代表一种能力,实现该接口的类和接口没有继承关系

08.接口是用来实现的,类是用来继承的。

09.其实很多时候,看似可以不用接口,因为接口就是一个方法的约定,

表明你这个类必须要有某些方法,但是不写接口也可以有这些方法,用了接口,

就可以使用接口变量,统一调用,实现多态

10.接口中只能定义方法,不能定义变量。

2.抽象类和接口的区别:

当需要的各个对象之间存在父子类关系时,可以考虑使用抽象类,

当各个对象之间不存在继承关系,只是有相同的能力时,而已考虑使用接口

3.接口的通俗理解

01.飞机会飞,鸟会飞,他们都继承了同一个接口“飞”;但是F22属于飞机抽象类,

鸽子属于鸟抽象类。

02.就像铁门木门都是门(抽象类),你想要个门我给不了(不能实例化),

但我可以给你个具体的铁门或木门(多态);而且只能是门,你不能说它是窗(单继承);

一个门可以有锁(接口)也可以有门铃(多实现)。

门(抽象类)定义了你是什么,接口(锁)规定了你能做什么

(一个接口最好只能做一件事,你不能要求锁也能发出声音吧(接口污染))

下面我们举个用接口实现多态的例子:

01.新建一个飞的接口

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace 接口
{
//飞的接口
public interface IFly
{
//接口中方法不用访问修饰符,因为CLR会自动添加,并且不能有方法体
void Say(); }
}

02.创建一个吃的接口

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace 接口
{
//吃的接口
public interface IEat
{
//接口中方法不用访问修饰符,因为CLR会自动添加,并且不能有方法体
void eat();
}
}

03.创建一个鸟类来实现飞的接口和吃的接口

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace 接口
{
//鸟实现飞的接口和吃的接口
public class Grid:IFly,IEat //注意 接口:接口叫继承 ,类:接口叫实现
{ //如果一个类实现了某个接口,就得实现该接口中所有的方法
public void Say()
{
Console.WriteLine("鸟在飞");
} public void eat()
{
Console.WriteLine("鸟在吃");
}
}
}

04.创建一个飞机类实现飞的接口

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace 接口
{
//飞机实现飞的接口
public class Plan:IFly
{ public void Say()
{
Console.WriteLine("飞机在飞");
}
}
}

05.在Main方法实现调用

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace 接口
{
class Program
{
static void Main(string[] args)
{
//定义飞接口数组实例化对象
IFly[] iFlies =
{
new Grid(),
new Plan()
};
//循环数组调用方法实现多态
foreach (IFly iFly in iFlies)
{
iFly.Say();
}
//鸟吃实例化对象
IEat iEats = new Grid();
//调用方法实现多态
iEats.eat(); Console.ReadLine();
}
}
}

这样就可实现多态了,运行结果如下:

注:如果有一个类要实现两个接口,不巧的是这两个接口(如:IFly,IPlay)中右两个同命名的方法(Eat)

我们都知道

如果一个类实现了某个接口,就得实现该接口中所有的方法

这怎么办呐?自有解决的方法的:

我们就可以使用接口名.方法来实现

  //实现了IFly和IPlay两个接口,但两个接口中都有Eat方法
public class Dog:IFly,IPlay
{
//如果一个类实现了某个接口,就得实现该接口中所有的方法
//这样我们就可以使用接口名.方法来实现
void IFly.Eat()
{ } void IPlay.Eat()
{ }
}

4.接口总结(摘录):

接口是组件之间的协议,描述了组件对外提供的服务。从技术上讲接口是一组包含了函数型方法的数据结构。 通过这组数据结构,客户代码可以调用组件对象的功能。接口可以从父接口中继承。接口的继承首先是说明性继承,不是实现性继承,它的实现需要通过类或结构来实现;其次接口继承可以是多继承。

属性的本质是方法,索引器的本质是属性。

      接口包含的成员有方法、属性、索引指示器和事件。由于接口允许多继承,在可能发生二义性的地方可以采用全权名来避免。可以用类来实现接口。在类中定位接口成员的实现称之为接口映射。类必须为接口的所有成员提供具体的实现,包括接口中显式定义的成员, 以及接口从父接口中继承而来的成员。同样,在对接口的实现过程中可以采用显式接口成员执行体来避免产生二义性。派生类可以对基类已经实现的接口进行重实现。

抽象类也可以实现接口,但接口成员必须映射到抽象类的抽象成员。抽象类的派生类如果是非抽象类,则必须通过方法重载来实现接口成员。

C#中的接口实现多态的更多相关文章

  1. 黑马程序员——【Java基础】——面向对象(一)概述、类与对象、继承、抽象类、接口、多态、内部类

    ---------- android培训.java培训.期待与您交流! ---------- 一.面向对象概述 1.面向对象:是一个很抽象的概念,它相对面向过程而言,是一种程序设计的思想. 2.面向对 ...

  2. Java基础学习笔记八 Java基础语法之接口和多态

    接口 接口概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的”类”.接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成.这样将功能的定义 ...

  3. java接口,接口的特性,接口实现多态,面向接口编程

    package cn.zy.cellphone; /**接口是一种引用数据类型.使用interface声明接口,形式 * 形式:public interface 接口名称{} * 接口不能拥有构造方法 ...

  4. 第五节:详细讲解Java中的接口与继承

    前言 大家好,给大家带来详细讲解Java中的接口与继承的概述,希望你们喜欢 什么是接口(interface) 接口中的方法都是抽象方法,public权限,全是抽象函数,不能生成对象 interface ...

  5. Java 基础 接口和多态

    接口 接口的概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的”类”. 接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成.这样将功能的 ...

  6. Java 面向对象之接口、多态

    01接口的概念 A:接口的概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的”类”. 接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成 ...

  7. day03(接口,多态)

    接口:            概念:是功能的集合,可以当做引用数据类型的一种.比抽象类更加抽象. 接口的成员:               成员变量:必须使用final修饰 默认被 public &a ...

  8. Java 接口和多态

    接口 1.1 接口的概述 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的”类”. 接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成.这样 ...

  9. 11_Java面向对象_第11天(接口、多态)_讲义

    今日内容介绍 1.接口 2.多态 01接口的概念 * A:接口的概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的"类". 接口只描述所应该具备的方法,并没有具 ...

随机推荐

  1. ci配置smarty手记

    需要用ci来写一个后台配置smarty,在网络上能够找到一些相关的文章.但是都是比较旧的内容,大部分是smary2.*的配置方法.按照这个配置后会出现一些错误.其实配置看smary官方会比较简单. 基 ...

  2. Microsoft 2013 新技术学习笔记 四

    在继续学习Model的实践经验之前,先思考一下Controller和View的实践原则在本次系统重构中的应用,我手上是一个后台管理系统(不是门户系统.不是具体业务系统),通俗点讲就是给企业的运维人员用 ...

  3. Maxdos 9.3不能引导系统进入Maxdos

    一.故障描述 最近安装一台新电脑安装的系统版本是windows7_professional_with_sp1_x64,安装完成后想用Maxdos对系统进行备份.出现错误:Warning: the hi ...

  4. php 使用zendstudio 生成webservice文件 wsdl

    首先新建一个项目 在项目中新建下面这些文件 php类文件 test.php <?php class test { public function __construct() { } public ...

  5. php 分页类

    <?php /* *本程序文件对分页程序进行了封装 * */ class Page_Link { var $page_max = 10; //一组页码的最大数 var $page_num = 1 ...

  6. 【NS2仿真】TCP协议

    # # ftp # \ # tcp sink # \ / # n0--------5M 2ms---------n1 # # set ns [new Simulator] set f [open ou ...

  7. Android ActionBar Home按钮返回事件处理的两种方式

    今早无聊查看了一下android官方文档,最近对ActionBar很感兴趣,它确实对我们的日常开发起到了很便捷的作用. 对于通过点击ActionBar的Home按钮返回,以前我只知道有一种方式:也就是 ...

  8. js中的执行上下文,菜鸟入门基础。

    console.log(a); //Uncaught ReferenceError: a is not defined 因为没有定义a所以报错了. var a = 52; console.log(a) ...

  9. SpringMVC架构浅析

    SpringMVC概述 Spring的web框架围绕DispatcherServlet设计. DispatcherServlet的作用是将请求分发到不同的处理器. Spring的web框架包括可配置的 ...

  10. 15个私有云上的DevOps 开源工具

    本文由来:之前工作需要,在查找运维自动化资料时,发现了这篇文章的英文原版,觉得很不错.它综合的介绍了哪些工具,我们运维人员需要掌握,并且如何进行结合其它工具一起使用.给了一些指导性的意见.由于是英文的 ...