接口,虚函数,抽象类的理解

原创 2016年08月28日 20:14:55
说明:接口其实就是程序之间的一种协定,用来约束一组相关的行为。这三种概念的功能很类似下面通过一些例子来说明。
1.接口
现在有三个动物:猫,狗,鸭子,猫不会游泳,狗会游泳,鸭子会游泳。我们要描述这三种动物,如果采用虚函数的形式,则无法解决游泳函数问题
using System;
class dongwu  //基类
{
    virtual public void youyong() //虚函数
    {
        Console.WriteLine("游泳");
    }
}
class mao:dongwu
{
    
}
class gou : dongwu
{
    override public void youyong()
    {
        Console.WriteLine("狗刨式游泳");
    }
}
class yazi : dongwu
{
    override public void youyong()
    {
        Console.WriteLine("靠浮力游泳");
    }
}
class Test
{
    public void show(dongwu d)
    {
        d.youyong();
    }
    public static void Main(string[] args)
    {
        Test t = new Test();
        mao m = new mao();
        gou g = new gou();
        yazi y = new yazi();
        t.show(m);  //无法解决游泳函数问题
        t.show(g);
        t.show(y);
    }
}

所以上面的方法无法解决这个问题,因此我们可以使用接口,接口里面封装游泳的方法,具体由继承的类去实现,这里可以想象类是对象的封装,结构是方法的封装(不知道是否合适)
using System;
interface you  //定义接口
{
    void youyong();
}
class mao //不会游泳所以不继承接口
{
    
}
class gou : you  //继承接口
{
    public void youyong()
    {
        Console.WriteLine("狗刨式游泳");
    }
}
class yazi : you
{
    public void youyong()
    {
        Console.WriteLine("靠浮力游泳");
    }
}
class Test
{
    public void show(you d)
    {
        d.youyong();
    }
    public static void Main(string[] args)
    {
        Test t = new Test();
        mao m = new mao();
        gou g = new gou();
        yazi y = new yazi();
        
        t.show(g);  //显示
        t.show(y);
    }
}

2.抽象类
抽象方法必须在抽象类中,且抽象类被继承以后子类必须实现基类中的抽象方法(基类中没有实现方法)。这一点和虚函数不同,虚函数必须有实现,所以子类不一定需要对基类方法进行重写,如果不重写子类使用基类的虚方法。
using System;
abstract class dongwu
{
    abstract public void youyong();
}
class mao    //:dongwu,如果要继承必须要有对youyong()的实现
{
    
}
class gou : dongwu
{
    override public void youyong()
    {
        Console.WriteLine("狗刨式游泳");
    }
}
class yazi : dongwu
{
    override public void youyong()
    {
        Console.WriteLine("靠浮力游泳");
    }
}
class Test
{
    public void show(dongwu d)
    {
        d.youyong();
    }
    public static void Main(string[] args)
    {
        Test t = new Test();
        mao m = new mao();
        gou g = new gou();
        yazi y = new yazi();
        
        t.show(g);
        t.show(y);
    }
}
3.虚函数
虚函数的作用主要是用于子类对父类方法的重写。
using System;
class dongwu
{
    virtual public void jiao()
    {
        Console.WriteLine("正常叫");
    }
}
class mao:dongwu   
{
    
}
class gou : dongwu
{
    override public void jiao()
    {
        Console.WriteLine("汪汪叫");
    }
}
class yazi : dongwu
{
    override public void jiao()
    {
        Console.WriteLine("嘎嘎叫");
    }
}
class Test
{
    public void show(dongwu d)
    {
        d.jiao();
    }
    public static void Main(string[] args)
    {
        Test t = new Test();
        mao m = new mao();
        gou g = new gou();
        yazi y = new yazi();
        t.show(m);
        t.show(g);
        t.show(y);
    }
}
4.重写和覆盖的区别
重写主要是用于实现多态,然而覆盖不能实现多态
using System;
class dongwu
{
    public void jiao()
    {
        Console.WriteLine("正常叫");
    }
}
class mao:dongwu   
{
    
}
class gou : dongwu
{
    public void jiao()
    {
        Console.WriteLine("汪汪叫");
    }
}
class yazi : dongwu
{
    public void jiao()
    {
        Console.WriteLine("嘎嘎叫");
    }
}
class Test
{
    public void show(dongwu d)
    {
        d.jiao();
    }
    public static void Main(string[] args)
    {
        Test t = new Test();
        mao m = new mao();
        gou g = new gou();
        yazi y = new yazi();
        t.show(m);  //输出"正常叫"
        t.show(g);  //输出"正常叫"
        t.show(y);  //输出"正常叫"
    }
}

总结:接口主要是对共同方法的封装但不实现其具体功能,主要是在程序间提供一种共同的协定。抽象类,抽象方法主要封装在类中不提供方法的实现,具体实现由子类去实现,用于提供程序最初的框架。虚函数用于在基类中定义的函数,在子类中能有重写的机会。三者的共同目标是实现多态。

C++学习篇——纯虚函数和抽象类

纯虚函数是一种特殊的虚函数,它的一般格式如下:     class     {         virtual ()=0;         …     };     在许多情况下...
  • yansmile1
  • yansmile1
  • 2016年04月13日 23:03
  • 460

虚函数、纯虚函数、抽象类、抽象方法和接口

首先讲下自己最近的电话面试遇到的相关问题。1、多态的两种实现方式?2、虚函数与纯虚函数的区别,如何使用这两种方式?3、接口和抽象类的关系?由这两个问题开始深入的理解一下虚函数,纯虚函数以及抽象类和接口...
  • feihaixin
  • feihaixin
  • 2015年02月15日 14:44
  • 715

C++虚函数和纯虚函数和抽象类

C++虚函数和纯虚函数和抽象类分析
  • x_r_su
  • x_r_su
  • 2016年08月31日 13:31
  • 695

抽象类的使用+虚析构

抽象类的使用+虚析构 分类: C/C++2013-10-23 10:36 155人阅读 评论(0) 收藏 举报 抽象类的使用+虚析构         纯虚函数可以让类先具...
  • b02330224
  • b02330224
  • 2014年04月02日 15:41
  • 688

C++的虚基类,抽象类,虚函数,纯虚函数,virtual

C++的虚基类,抽象类,虚函数,纯虚函数,virtual 虚基类 在说明其作用前先看一段代码 class A { public: int iValue; }; class ...
  • shejiannan
  • shejiannan
  • 2015年05月20日 14:21
  • 1447

c#中抽象类和虚方法的区别?

你说的是抽象类和虚方法吧! 其实这是哲学的思维方式,所谓哲学就是建立事实基础上,是人类对世界的思考和认识。 要理解抽象类就必须要有一定的编程经验,就好像要理解哲学就需要有一定的生活经验。跟一个没有...
  • juelingfeng
  • juelingfeng
  • 2014年08月07日 13:25
  • 1329

虚函数和纯虚函数区别及抽象类的介绍

首先:强调一个概念 定义一个函数为虚函数,不代表函数为不被实现的函数。 定义他为虚函数是为了允许用基类的指针来调用子类的这个函数。 定义一个函数为纯虚函数,才代表函数没有被实现。 定义纯虚函数...
  • u012542343
  • u012542343
  • 2014年05月10日 11:02
  • 461

C++学习:虚函数,纯虚函数(virtual),虚继承,虚析构函数

C++学习:虚函数,虚继承,纯虚函数(virtual)虚析构函数 虚函数 纯虚函数 虚析构函数 虚继承 简介 在java这种高级语言中,有abstract和interface这两个关键字.代...
  • qq_29924041
  • qq_29924041
  • 2017年06月25日 11:21
  • 770

C++与C#中的虚函数、纯虚函数、抽象类的对比

一、C++中            1、虚函数(virtual)     第一次引入虚拟函数的基类时,必须在类声明中指定virtual关键字。如果虚函数的定义放在类的外面,则不能再次指定关键字vi...
  • u010168160
  • u010168160
  • 2014年04月05日 17:48
  • 3909

PHP中抽象方法、抽象类和接口的用法

1. 抽象方法 在类中,没有方法体的方法就是抽象方法。 abstract 可见性 function 方法名称(参数1,.....);      // 如果没有显示地指定可见性,则默认为publ...
  • lamp_yang_3533
  • lamp_yang_3533
  • 2016年03月08日 20:29
  • 3095
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:接口,虚函数,抽象类的理解
举报原因:
原因补充:

(最多只允许输入30个字)