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. 魔方阵算法及C语言实现

    1 魔方阵概念 填充的,每一行.每一列.对角线之和均相等的方阵,阶数n = 3,4,5….魔方阵也称为幻方阵. 例如三阶魔方阵为: 魔方阵有什么的规律呢? 魔方阵分为奇幻方和偶幻方.而偶幻方又分为是4 ...

  2. Eclipse+Axis自动生成Web Service WSDL文件

    JDK版本:1.5.0_22 Eclipse版本:Helios Service Release 2(3.6.2) 首先创建一个web工程,创建过程如下: 如果选择Apache Tomcat v5.5, ...

  3. HDU 1241 Oil Deposits (DFS/BFS)

    Oil Deposits Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tota ...

  4. 在Flex4中使用RemoteObjectAMF0来连接fluorine网关 转

    转http://vipnews.csdn.net/newscontent.aspx?pointid=2011_04_21_142132661 RemoteObjectAMF0是一个开源组件,可以很方便 ...

  5. 【概率dp,难度3颗星】hdu-5001(2014鞍山网络赛)

    给你一个连通的无向图,等概率随机选取一个起点,走d步,每一步等概率走到相邻的点.问走完d步之后,每个点没有被经过的概率. 推状态的关键当然就是对这个“从任意起点走完d步点node没被经过的概率”的理解 ...

  6. Windows 8.1 归档 —— Step 2 对新系统的少量优化

    下面是来自 iplaysoft 的优化技巧:

  7. 转:C++ 性能测试支持

    转: http://codinginet.com/articles/view/201606-use_gtestx_for_benchmark?simple=1&from=timeline&am ...

  8. Bootstrap ACE后台管理界面模板-jquery已整理

    做后台通用模板,基于bootstrap,jquery写成的模板,非常齐全.国内不能正常访问google我将不能访问的jquery替换成cdn.bootcss.com网站下的jquery 链接: htt ...

  9. 在jQuery环境下制作轻巧遮罩层

    遮罩层的好处就是可以屏蔽用户对遮罩层下方元素的操作. 制作原理很简单:1设置遮罩层触发按钮 2设置遮罩层内容 3设置遮罩层背景(重点是捕获内容div的大小位置)4设置点击触发按钮遮罩层背景内容同时显示 ...

  10. android 获取前台进程

    String getTopActivity() { ActivityManager manager = (ActivityManager)getSystemService(ACTIVITY_SERVI ...