在看大话设计模式的时候经常会看到abstract,virtual方法,并且这两个方法都可以用override在子类中进行重写,刚一看到时有点搞不清楚,既然这两个方法都可以进行重写,并且都可以在抽象类中定义,那么他们之间有什么区别,在什么时候用abstract,什么时候用virtual呢?下面就这个问题总结一下:
1.virtual方法、与abstract方法的区别:
(1)首先必须明确,这两个方法是都可以在抽象类中定义的,但是abstract方法不可以在抽象类中进行实现,必须要在他的子类中用override对函数的实体进行重写,也就是说abstract只定义了一个函数的名称,而这个函数功能的实现是要在继承该抽象类中的子类中实现的,而且是必须要重写函数,否则编译不会通过;virtual方法可以在抽象类中进行定义,同时可以在抽象类中就实现该方法,并且如果在抽象类中实现了该方法,在继承该抽象类的子类中依然可以用override重新构造该函数的函数实体,实现特定功能;
(2)abstract只能用在抽象类中,不可以用在非抽象类中。如果某一非抽象类中有abstract函数则必须将该类定义为抽象类,否则编译不会通过;virtual函数可以用在非抽象类中,并且该非抽象类的子类可以通过override进行重写,以实现子类特有的功能;
2.virtual和abstract的具体用法
首先要明确一点virtual方法是可以在抽象类中实现的,而abstract方法是不可以在抽象类中实现的。abstract方法主要是对具相同方法但不同实现方式的函数而言的,而virtual方法是对相同方法并且相同表现形式的函数而言的。下面简单举例;
如果我们现在定义了一个动物类,每种动物都有发音这样一个动作;但是不同的动物发音的方式是不一样的,有的用喉咙发音,有的用翅膀摩擦发音,显然这两种动物有相同的方法“发音”,但是更显然的是这两种发音的方式是由很大的不同的(一个用翅膀一个用喉咙),所以在抽象类中用virtual方法是不合适的,这时候需要定义abstract方法,并且在具体的类中用不同的方法分别实现发音这个操作。
如果现在我们又定义了一个抽象类“人”,“人”这个类有两个子类分别是“男人”和“女人”,这两个子类有相同的方法“喝水”,并且这两个方法实现的方式是相同的都是用口喝水,这时我们就可以在“人”这个抽象父类中用virtual定义一个喝水的方法,并且在父类中就将这个方法实现,在子类中我们就可以直接通过继承的形式将这个方法继承郭磊而不必分别在“男人”类和“女人”类中分别实现,大大简化了代码量。
3.abstract和interface
抽象类和接口的作用十分的相似,都是先定义一个函数体(未实现)然后通过子类的继承,在子类中进行具体实现。但是二者还是有区别的。在C#中是不允许多重继承的,也就是说一个类最多只能有一个父类。如果一个类A有某方法,类B有某种方法,类C有某种方法....,类甲在不可以多重继承的情况下如果想要同时获得这些类的方法该怎么办?这时我们就可以将这些空函数放在同一个接口中,然后分别在具体的子类中给出具体的程序体。