zoukankan      html  css  js  c++  java
  • C#中的抽象方法,虚方法,接口之间的对比

    1.首先来看一看抽象类

    抽象类是特殊的类,不能够被实例化;具有类的其他特性;抽象方法只能声明于抽象类中,且不包含任何实现 (就是不能有方法体),派生类也就是子类必须对其进行重写。
    另外,抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如果不覆盖,则其派生类必须覆盖它们。
    关键字就是 abstract
    /*
         * 抽象方法必须写在,抽象类中
         *
         */
        public abstract class Animal
        {

    public abstract void Sleep(); public abstract void Eat(); }

     这里定义了一个抽象类和两个抽象方法,之后我们在定义子类去继承它

    /*
         *抽象类必须被重写
         */
        public class cat : Animal
        {
            public override void Eat()
            {
                Console.WriteLine("我是cat,重写了Eat");
            }
    
            public override void Sleep()
            {
                Console.WriteLine("我是cat,重写了Sleep");
            }
        }

    这里定义了一个cat类去继承Animal,如果不实现的话,就会报如下的错误

    这里vs开发工具就会提示我们实现抽象类,vs可以自动帮我们去实现,然后去写自己的代码就可以了,然后就是调用

                Animal an = new cat();
                an.Eat();
                an.Sleep();

    因为cat类继承了Animal并重写了里面的方法,所以我们可以直接替换Animal让cat代替出现,抽象类同样也可以定义自己的方法,例如:

        public abstract class Animal
        {
            public void show()
            {
                Console.WriteLine("我是抽象类自己的方法");
            }
            public abstract void Sleep();  
            public abstract void Eat();
        }

    2.我们再来看一看虚方法

    virtual关键字用于修饰方法

    /*
         * 虚方法,必须有方法体
         */
        public class people
        {
            public virtual void Sleep() { }
            public virtual void Eat() { }
        }

    定义虚方法必须要有方法体,然后定义子类去继承people

    /*
         * 虚方法可以不被重写
         */
        public class student:people
        {
            public override void Sleep()
            {
                Console.WriteLine("我是student,");
            }
        }

    如果说只是继承了people这个类而没有去重写它的方法,这样的情况是不会报错的,我在这里只是重写了people的Sleep方法,override后面加返回值类型 基类的方法名

    然后就是调用

    people op = new student();
    op.Sleep();

    3.然后就是接口

    接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量

    /*
         * 接口中的成员是隐式公有的,不能加修饰符
         */
        public interface ImyInterface
        {
            int aa { get; set; }
            void test();
        }
    

    然后我们去定义子类,实现接口

    public class overInterface : ImyInterface
        {
            public int aa { get; set; }
    
            public void test()
            {
                Console.WriteLine("我实现了接口,");
            }
        }

    如果不实现接口,就会报以下错误

    然后就是调用

    ImyInterface ter = new overInterface();
                ter.aa = 45;
                ter.test();
                Console.WriteLine(ter.aa);

    那么我们来总结一下

    抽象方法:

           1.必须定义在抽象类中,

           2.不能够被实例化

           3.子类必须对其进行重写

           4.定义抽象方法时不能够有方法体  { } 都不能有

           5:关键字 abstract

    虚方法:

           1:可以不被重写

           2:定义方法时能够有自己的方法体

           3:关键字:virtual

    接口:

           1:定义时不能加访问修饰符,也不能有方法体

           2:它的子类必须实现所有方法,与抽象类相似

           3:关键字:interface

    那么这里有一个问题:

           接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)? 

    答案:

           接口可以继承接口。抽象类可以实现(implements)接口,抽象类是否可继承实体类,但前提是实体类必须有明确的构造函数。












  • 相关阅读:
    express 连接 moogdb 数据库
    数组 去重
    vue 路由meta 设置title 导航隐藏
    :src 三目运算
    axios baseURL
    js对象修改 键
    Swiper隐藏后在显示滑动问题
    字符串中的替换
    获取服务器时间
    vue a链接 添加参数
  • 原文地址:https://www.cnblogs.com/NiuZiXiao/p/10249126.html
Copyright © 2011-2022 走看看