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. Scala中的构造器和高阶函数

    构造器 在定义类时可以定义主构造器.主构造器可以同时声明字段. /** * 主构造器 * @author Administrator */ //在scala中,类和方法交织在一起 class Test ...

  2. 使用 autoconf

    在此之前先说一下autooconf在linux下安装的问题,因为不知道怎么安装,我就直接在终端上输入autoconf,结果它会提示是否安装它,下面还有指定安装的方法,我 就直接输入,是什么命令记不住了 ...

  3. 【STL+模拟】UVa 506 - System Dependencies

    System Dependencies  Components of computer systems often have dependencies--other components that m ...

  4. 初识Less(2015年05月23日)

    因为最近在研究Bootstrap,然后才了解到Less,听说Less很强大,又听说Bootstrap+Less会更搭,所以就决定也顺带了解下Less的相关知识. come  on...... 一.简介 ...

  5. ORA-01790 错误处理

    今天在练手的时候出现了一个ORA-01790 的错误,决定把他写下来保留起来. 先来创建两张测试用的简单的表. SQL> create table test01 (id number(3),na ...

  6. django 学习-6 定义模型--数据库的使用

    1.service mysqld start  首先数据库是可用的 2.rpm -qa |grep MySQL-python  这个包是存在的 3.vim settings 修改databases 加 ...

  7. SQLite CRUD操作

    SQLite CRUD操作代码实例: 1:首先创建一个继承了SQLiteOpenHelper类的MyDatabaseHelper类.实现他的onCreate(SQLiteDatabase db) on ...

  8. Android中用PULL解析XML

    解析XML的方式有DOM,SAX,PULL,那为什么要在Android中使用PULL解析呢?首先来说一下PULL解析的优点,然后再说一下其他两种解析方式的缺点,答案就清晰可见啦. DOM不适合文档较大 ...

  9. C++ Iterator迭代器介绍及Iterator迭代器用法代码举例

    C++ Iterator迭代器介绍 迭代器可被用来访问一个容器类的所包函的全部元素,其行为像一个指针.举一个例子,你可用一个迭代器来实现对vector容器中所含元素的遍历.有这么几种迭代器如下: 迭代 ...

  10. 【转】 SqlServer性能检测和优化工具使用详细

    http://blog.csdn.net/dcx903170332/article/details/45917387