OOP继承的区别提纲:

1. 普通类继承,并非一定要重写父类方法。
2. 抽象类继承,如果子类也是一个抽象类,并不要求一定重写父类方法。如果子类不是抽象类,则要求子类一定要实现父类中的抽象方法。
3. 接口类继承。如果是一个子接口,可以扩展父接口的方法;如果是一个子抽象类,可以部分或全部实现父接口的方法;如果子类不是抽象类,则要求子类一定要实现父接口中定义的所有方法。

1.抽象类继承

在定义类的前面加上关键字abstract,那么这个类就是抽象类了,

抽象类本身无法产生实例对象,而且抽象类包含了一个以上的抽象方法,这些方法只是提供函数名称,并没有定义如何具体实现,由继承的派生类实现,

派生类同时必须实现所有抽象类的方法,否则其本身将成为另外一个抽象类。

需要我们注意的一点是,当派生类重写抽象类的方法时,要使用override关键字来重写抽象类所定义的方法

抽象类只能被继承,不能被实例化,抽象类的抽象方法是虚方法

新建person类:

public abstract class Person
    {
        public abstract void show();
    }

public class Student : Person 
    {
        public override void show()
        {
            Console.WriteLine("我是老大!");
        }
    }

public class Manager : Person 
    {
        public override void show()
        {
            Console.WriteLine("我是管理员!");
        }
    }

另建一个Teacher类

class Teacher
    {
        public void tShow(Person person) 
        {
            person.show();
        }
    }

在Main方法实现:

static void Main(string[] args)
        {
            Teacher teacher = new Teacher();
            teacher.tShow(new Manager());
        }

2.接口类继承

类和接口继承

14.2定义接口

14.3接口的继承

 public static class Program
    {
        static void Main(String[] args) { 
           //-------------------------
            Console.WriteLine("---第一个例子---");
            BaseClass b = new BaseClass();
            b.fun1();
            b.fun2();
            ((Itest)b).fun1();
            ((Itest)b).fun2();
           //--------------------------
            Console.WriteLine("---第二个例子---");
            SonOne s1 = new SonOne();
            s1.fun1();
            s1.fun2();
            ((Itest)s1).fun1();
            ((Itest)s1).fun2();
          //----------------------------
            Console.WriteLine("---第三个例子---");
            b = new SonOne();
            b.fun1();
            b.fun2();
            ((Itest)b).fun1();
            ((Itest)b).fun2();
          //----------------------------
            Console.WriteLine("---第四个例子---");
            SonTwo s2 = new SonTwo();
            s2.fun1();
            s2.fun2();
            ((Itest)s2).fun1();
            ((Itest)s2).fun2();
          //----------------------------
            Console.WriteLine("---第五个例子---");
            b = new SonTwo();
            b.fun1();
            b.fun2();
            ((Itest)b).fun1();
            ((Itest)b).fun2();
        //----------------------------
            Console.ReadLine();
        }
    }
    public interface Itest {
        void fun1();
        void fun2();
    }
    //1.BaseClass必须实现Itest中的所有方法 fun1,fun2
    //2.应将接口方法标记为virtual,如果不显示标记,编译器会把它标记为virtual和sealed。这样派生类就无法重写接口方法了。
    //  派生类可以重新继承同一个接口,并提供自己的实现。
    internal  class BaseClass : Itest {
        //fun1将被标记为sealed,不能被重写
        public void fun1() {
            Console.WriteLine("BaseClass.fun1");
        }
        public virtual void fun2()
        {
            Console.WriteLine("BaseClass.fun2");
        }
    }
    internal class SonOne : BaseClass {
        //派生类无法重写基类方法fun1
        new public void fun1() {
            Console.WriteLine("SonOne.fun1");
        }
        //派生类可以重写基类方法fun2
        public override void fun2()
        {
            Console.WriteLine("SonOne.fun2");
        }
    }
    internal class SonTwo : BaseClass, Itest 
    {
        //派生类无法重写基类方法fun1,new表示重新实现Itest的fun1
        new public void fun1()
        {
            Console.WriteLine("SonOne.fun1");
        }
        //派生类可以重写基类方法fun2
        public override void fun2()
        {
            Console.WriteLine("SonOne.fun2");
        }
    }

结果:

OOP三类继承的区别的更多相关文章

  1. C++接口继承与实现继承的区别和选择

    1.接口继承与实现继承的区别 <Effective C++>条款三十四:区分接口继承和实现继承中介绍的比较啰嗦,概括地说需要理解三点: (1)纯虚函数只提供接口继承,但可以被实现: (2) ...

  2. java 装饰者模式与继承的区别

    装饰者模式目标 把许多要实现的功能,加载在子类上,类的继承,显得很臃肿,装饰着模式是在不改变原有类文件和使用继承的情况下,通过创建一个包装对象动态地扩展一个对象的功能,相比生成子类更为灵活 装饰者模式 ...

  3. python_way day10 python和其他语言的作用域 、 python2.7多继承和3.5多继承的区别 、 socket 和 socketserver源码(支持并发处理socket,多进程,多线程)

    python_way day10 1.python的作用域和其他语言的作用域 2.python2.7多继承和3.5多继承的区别 3.socket和socketserver源码(并发处理socket) ...

  4. oc中protocol、category和继承的区别

    OC中protocol.category和继承的区别以前还是有点迷糊,面试的时候说的有点混乱,现在结合一些资料总结一下. 利用继承,多态是一个很好的保持"对扩展开放.对更改封闭"( ...

  5. Java基础---Java---IO流-----BufferedReader、BufferedWriter、缓冲区、装饰设计模式及和继承的区别

    IO流 IO流用来处理设备之间的数据传输 java对数据的操作是过流的方式 流按操作数据分为两种:字节流与字符流 流按流向分为:输入流,输出流. IO流常用基类 字节流的抽象基类:InputStrea ...

  6. 7 -- Spring的基本用法 -- 8... 抽象Bean与子Bean;Bean继承与Java继承的区别;容器中的工厂Bean;获得Bean本身的id;强制初始化Bean

    7.8 深入理解容器中的Bean 7.8.1 抽象Bean与子Bean 把多个<bean.../>配置中相同的信息提取出来,集中成配置模版------这个配置模版并不是真正的Bean,因此 ...

  7. Java 多线程实现接口Runnable和继承Thread区别(转)

    Java 多线程实现接口Runnable和继承Thread区别 Java中有两种实现多线程的方式.一是直接继承Thread类,二是实现Runnable接口.那么这两种实现多线程的方式在应用上有什么区别 ...

  8. 抽象类,interface接口,接口和继承的区别

    一.抽象类 需要抽象类的原因:父类方法不确定性的问题.考虑将该方法设计为抽象(abstract)方法所谓抽象方法就是没有实现的方法.所谓没有实现就是指,没有方法体.当一个类中存在抽象方法时,需要将该类 ...

  9. 【C#】OOP之继承那点事

    前言: 继承这点事,说多不多,说少不少,这里只描述了一些我认为的基础篇,望各位大神指教.本节参照了C#高级编程和Think in java对继承的描述,我个人认为OOP只是思想,故看明白一个就说通的, ...

随机推荐

  1. mongoDB操作命令及mongoDB的helper

    此项目已开源,开源地址是: http://mongodbhelper-csharp.googlecode.com/svn/trunk/ mongodb的helper using System; usi ...

  2. 获取地理位置的html5代码

    /** * 以下为html5代码,获取地理位置 */ function getLocation() { //检查浏览器是否支持地理位置获取 if (navigator.geolocation) { / ...

  3. Simple Membership 学习笔记

    第一步:新建项目后添加对WebMartix.Data 和 WebMatrix.WebData的引用第二步:在web.config中添加membership配置节第三步:修改Global.asax文件 ...

  4. Adobe Edge Animate –解决图形边缘精确检测问题-通过jquery加载svg图片

    Adobe Edge Animate –解决图形边缘精确检测问题-通过jquery加载svg图片 版权声明: 本文版权属于 北京联友天下科技发展有限公司. 转载的时候请注明版权和原文地址. 在edge ...

  5. Windows 8.1 归档 —— Step 1 选择与安装

    下面是 Windows 8.1 各版本区别: Windows 8.1 标准版(一般就称之为Windows 8.1): 包括全新的 Windows 商店.Windows 资源管理器.任务管理器等等,还将 ...

  6. MYSQL5.5和5.6参数的差异

    performance_schema 在 MySQL 5.6 中默认是开启的,但相关的很多参数相比 MySQL 5.5 却是降低了,例如 performance_schema 自动调整到 445 个表 ...

  7. Acrobat 2015 win32破解版

    Acrobat 2015 win32破解版,带破解补丁dll覆盖即可 百度云盘:http://pan.baidu.com/s/1i4tFnNJ

  8. Android经验之谈1

    豌豆荚等可能会导致手机网络出现问题,电话打不进来,所以需要及时卸载豌豆荚. 系统apk,不能通过在manifest.xml里面添加origin-package或者useid等来改变. 而是需要用and ...

  9. asp.net输出重写压缩页面文件实例

    例子  代码如下 复制代码 using System;using System.Data;using System.Configuration;using System.Web;using Syste ...

  10. Cocos2d-x数据持久化-修改数据

    修改数据时,涉及的SQL语句有insert.update和delete语句,这3个SQL语句都可以带参数.修改数据的具体步骤如下所示.(1) 使用sqlite3_open函数打开数据库.(2) 使用s ...