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



原文地址:https://www.cnblogs.com/NiuZiXiao/p/10249126.html

时间: 2024-11-07 04:58:38

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

C#中virtual(虚方法)的理解以及和abstract(抽象方法)的区别

Virtual方法(虚方法) virtual 关键字用于在基类中修饰方法.virtual的使用会有两种情况: 情况1:在基类中定义了virtual方法,但在派生类中没有重写该虚方法.那么在对派生类实例的调用中,该虚方法使用的是基类定义的方法. 情况2:在基类中定义了virtual方法,然后在派生类中使用override重写该方法.那么在对派生类实例的调用中,该虚方法使用的是派生重写的方法. 代码如下: namespace VirtualTestApplication{ public class

C#基础-接口 抽象方法 虚方法

一:接口 1:类是单继承,接口是多继承. 2:接口中不能有属性,不能有方法体. 3:接口不能被实例化,只能被继承. 4:接口中的所有定义,必须在子类中全部实现. 二:抽象方法 1:含有抽象方法的类,是抽象类. 2:抽象类不能被实例化,只能被继承. 3:抽象方法不能有方法体. 4:抽象方法必须在子类中重写. 5:抽象类可以包含功能实现. 6:抽象方法是可以看成是没有实现体的虚方法 三:虚方法 1:虚方法必须有方法体,可以被重写. 2:修饰方法.属性.索引器或事件

C#类、接口、虚方法和抽象方法

虚方法和抽象方法都可以供派生类重写,它们之间有什么区别呢? 1. 虚方法必须有实现部分,并为派生类提供了重写该方法的选项.抽象方法没有提供实现部分,抽象方法是一种强制派生类重写的方法,否则派生类将不能被实例化 2. 抽象方法只能在抽象类中声明, 抽象方法必须在派生类中重写.虚方法不是也不必要重写.其实如果类包含抽象方法,那么该类也是抽象的,也必须声明为抽象的 3. 抽象方法必须在派生类中重写,这一点跟接口类似,虚拟方法不必.抽象方法不能声明方法体,而虚拟方法可以. 包含抽象方法的类不能实例化 ,

关于C#中的抽象类、抽象方法和虚方法的探究

2016年的第一篇文章,容我先喷喷新年的情怀,..........,好了,喷的差不多了. 在面向对象中,我们需要对类进行横向和纵向的认识,不同的类有不同特色的成员,同时在不同类的继承中,子类获得父类的成员也是丰富多彩. 先概述: 1.抽象类 抽象类中不是所有的方法都是抽象方法,对于单纯抽象类而言,是限制类的实例化,可以没有抽象方法.甚至没有任何成员也没事.          2.抽象方法             抽象方法的目的是为了让派生类实现其方法,抽象的方法不实现,抽象方法没有方法体,没有大

C#中抽象方法与虚方法的区别

一.抽象方法:只在抽象类中定义,方法修饰符不能使用private,virtual,static. 抽象方法如下示: public abstract class People   //声明一个抽象类 { public abstract void study();  //抽象方法只能定义在抽象类中. } public class Student:People   //继承抽象类 { public  override void study()     //重写抽象类的抽象方法 { Console.Wr

虚方法与抽象方法有什么区别

抽象方法是只有定义.没有实际方法体的函数,它只能在抽象函数中出现,并且在子类中必须重写:虚方法则有自己的函数体,已经提供了函数实现,但是允许在子类中重写或覆盖. 重写的子类虚函数就是被覆盖了. 抽象方法 使用abstract关键字 public abstract bool Withdraw(-); 抽象方法是必须被派生类覆写的方法. 抽象方法是可以看成是没有实现体的虚方法 如果类中包含抽象方法,那么类就必须定义为抽象类,不论是否还包含其它一般方法 虚方法 使用virtual关键字 public

虚方法和抽象方法--基础回顾

抽象方法是只有定义.没有实际方法体的函数,它只能在抽象函数中出现,并且在子类中必须重写:虚方法则有自己的函数体,已经提供了函数实现,但是允许在子类中重写或覆盖.重写的子类虚函数就是被覆盖了. 抽象方法 使用abstract关键字 public abstract bool Withdraw(…); 抽象方法是必须被派生类覆写的方法. 抽象方法是可以看成是没有实现体的虚方法 如果类中包含抽象方法,那么类就必须定义为抽象类,不论是否还包含其它一般方法 虚方法 使用virtual关键字 public v

[转]虚方法(virtual)和抽象方法(abstract)的区别

虚方法和抽象方法都可以供派生类重写,它们之间有什么区别呢? 1. 虚方法必须有实现部分,抽象方法没有提供实现部分,抽象方法是一种强制派生类覆盖的方法,否则派生类将不能被实例化.如: //抽象方法public abstract class Animal{    public abstract void Sleep();    public abstract void Eat();} //虚方法public class Animal{    public virtual void Sleep(){}

Virtual方法(虚方法)和Abstract方法(抽象方法)

一.Virtual方法(虚方法) virtual 关键字用于在基类中修饰方法.virtual的使用会有两种情况:情况1:在基类中定义了virtual方法,但在派生类中没有重写该虚方法.那么在对派生类实例的调用中,该虚方法使用的是基类定义的方法.情况2:在基类中定义了virtual方法,然后在派生类中使用override重写该方法.那么在对派生类实例的调用中,该虚方法使用的是派生重写的方法. 当一个方法被声明为Virtual时,它是一个虚拟方法,直到你使用ClassName variable =