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

原创 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# 适应虚函数,抽象类,接口分别实现多态的方法总结。

本文学习多态的实现。 虚函数可以实现多态 : 就是基类定义一个函数使用virtual来进行修饰,然后在继承类里面使用override进行重写,这样clr在调用实例的方法的时候会判断这个实例到底是那...
  • sdgxboy
  • sdgxboy
  • 2012年01月08日 23:15
  • 2030

虚函数和抽象类和接口

关键字 Virtual Virtual是C++ OO机制中很重要的一个关键字。只要是学过C++的人都知道在类Base中加了Virtual关键字的函数就是虚拟函数(例如函数print),于是在 Bas...

c++虚函数, 接口, 抽象类

c++的抽象类可以作为接口,实现事件回调等机制. 接口实现文件IDemoImpl.cpp #include #include "IDemo.h" IDemo::IDemo(){}...

纯虚函数和抽象类的实例

  • 2015年04月14日 19:33
  • 1.67MB
  • 下载

抽象类与虚函数的应用

  • 2017年11月10日 12:15
  • 1.12MB
  • 下载

[收集]c++抽象类、纯虚函数以及巧用纯虚析构函数实现接口类

在Java、C#中有关键词abstract指明抽象函数、抽象类,但是在C++中没有这个关键词,很显然,在C++也会需要只需要在基类声明某函数的情况,而不需要写具体的实现,那C++中是如何实现这一功能的...
  • yockie
  • yockie
  • 2011年11月29日 17:33
  • 6555

继承,虚函数,抽象类

  • 2012年10月11日 11:31
  • 27KB
  • 下载

第十三周实验--任务1--我对虚函数、多态性和抽象类的理解

/* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2011, 烟台大学计算机学院学生  * All rights reserved. * 文件名称:我对...

第十三周作业任务1我对虚函数、抽象类和多态性的理解

任务1.1 /* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2011, 烟台大学计算机学院学生 * All rights reserved. * 文...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:接口,虚函数,抽象类的理解
举报原因:
原因补充:

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