欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#中的抽象方法,虚方法,接口之间的对比

程序员文章站 2022-07-08 19:50:40
1.首先来看一看抽象类 这里定义了一个抽象类和两个抽象方法,之后我们在定义子类去继承它 这里定义了一个cat类去继承Animal,如果不实现的话,就会报如下的错误 这里vs开发工具就会提示我们实现抽象类,vs可以自动帮我们去实现,然后去写自己的代码就可以了,然后就是调用 因为cat类继承了Anima ......

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,如果不实现的话,就会报如下的错误

C#中的抽象方法,虚方法,接口之间的对比

这里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("我实现了接口,");
        }
    }

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

C#中的抽象方法,虚方法,接口之间的对比

然后就是调用

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