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. ASP.NET弹出模态对话框【转】

    主页面 PageBase.aspx.cs 中的代码 protected void Page_Load(object sender, EventArgs e) {    if (!this.IsPost ...

  2. URAL 1136 Parliament 二叉树水题 BST后序遍历建树

    二叉树水题,特别是昨天刚做完二叉树用中序后序建树,现在来做这个很快的. 跟昨天那题差不多,BST后序遍历的特型,找到最后那个数就是根,向前找,比它小的那块就是他的左儿子,比它大的那块就是右儿子,然后递 ...

  3. WampServer下修改和重置MySQL密码(转)

    转自:www.2cto.com/database/201504/387589.html WampServer安装后密码是空的, 修改一般有两种方式: 一是通过phpMyAdmin直接修改: 二是使用W ...

  4. Java从Jar文件中动态加载类

    动态加载jar包,在实际开发中经常会需要用到,尤其涉及平台和业务的关系的时候,业务逻辑部分可以独立出去交给业务方管理,业务方只需要提供jar包,就能在平台上运行. 下面通过一个实例来直观演示: 第一: ...

  5. Java Concurrency - Fork/Join Framework

    Normally, when you implement a simple, concurrent Java application, you implement some Runnable obje ...

  6. JMS - ConnectionMetaData

    A Connection provides a ConnectionMetaData object. This object provides the latest version of JMS su ...

  7. CSS之生成全屏背景图片

    在CSS中背景图片的填充方法: background-position:x,y(背景图片x,y轴的定位) background-repeat:no-repeat(不平铺) background-rep ...

  8. JavaScript之可运行按钮

    看到好多大神都写了像这种在页面"可运行"的Javascript脚本,感觉很好奇,所以我今天也试着写了一个. 自从有了这个"可运行"按钮,好多代码就再也不以图片的 ...

  9. Oracle 一些操作

    Achivelog ============================ alter system set db_recovery_file_dest='F:\ORACLE\recovery_ar ...

  10. C++与Lua交互(一)

    引言 之前做手游项目时,客户端用lua做脚本,基本所有游戏逻辑都用它完成,玩起来有点不爽,感觉"太重"了.而我又比较偏服务端这边(仅有C++),所以热情不高.最近,加入了一个端游项 ...