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)接口,抽象类是否可继承实体类,但前提是实体类必须有明确的构造函数。

 

 












posted @ 2019-01-10 11:51  牛子潇123  阅读(587)  评论(1编辑  收藏  举报