**
一次搞懂C#的关键字abstract、override、virtual的区别与用法
**
其实编码相当于翻译,我们要从英文翻译成机器能懂的语言,而编程语言要学懂,需要翻译成我们能理解的汉语。
virtual 很接近的;几乎…的;事实上的;实际上的;实质上的;(通过计算机软件,如在互联网上**)模拟的,虚拟的**
abstract: 抽象的(与个别情况相对);纯理论的;抽象的(与具体经验相对);抽象(派)的
override :(以权力)否决,推翻,不理会;比…更重要;凌驾;超驰控制,超控(使自动控制暂时失效,改用手工控制)
virtual ,虚拟的,我们通常叫虚方法。
abstract ,抽象的,我们通常较抽象方法,抽象类。
override ,否决,推翻,意思是重写。
在面向对象设计的程序中,我们会经常用到,我们先按照具体的字面意思可以理解一下。
相同点:它们都是adj
不同点: abstract可以用来修饰类、方法、属性、索引器和事件,表示所修饰的内容缺少实现或未完全实现。
virtual 修饰方法、属性、索引器或事件声明,不能用来修饰类,并使它们可以在派生类中被重写。
override 只能用来修饰方法和属性,主要用来重写方法,属性,重写的方法必须是 virtual、abstract 或 override 修饰的,不能重写非虚方法或静态方法。
派生类:子类的意思。
abstract 抽象的
(1)抽象类具有以下特性:
-
抽象类不能实例化。
-
抽象类可以包含抽象方法和抽象访问器。
-
不能用 sealed 修饰符修饰抽象类,因为这两个修饰符的含义是相反的。采用 sealed 修饰符的类无法继承,而 abstract 修饰符要求对类进行继承。
-
从抽象类派生的非抽象类(子类)必须包括继承的所有抽象方法和抽象访问器的实际实现。
-
在方法或属性声明中使用 abstract 修饰符以指示方法或属性不包含实现。
(2)抽象方法具有以下特性:
-
抽象方法是隐式的虚方法。
-
只允许在抽象类中使用抽象方法声明。
-
因为抽象方法声明不提供实际的实现,所以没有方法体;方法声明只是以一个分号结束,并且在签名后没有大括号 ({ })。
(3)在抽象方法声明中使用 static 或 virtual 修饰符是错误的。除了在声明和调用语法上不同外,抽象属性的行为与抽象方法一样。在静态属性上使用abstract修饰符是错误的。在派生类中,通过包括使用 override 修饰符的属性声明,可以重写抽象的继承属性。
virtual 虚拟的
virtual关键字用于修饰方法、属性、索引器或事件声明,并使它们可以在派生类中被重写。虚拟成员的实现可由派生类中的重写成员更改。默认情况下,方法是非虚拟的。不能重写非虚方法。virtual 修饰符不能与 static、abstract, private 或 override 修饰符一起使用。和抽象方法的相同点是都用了override关键字进行重写方法,不同点是抽象方法必须存在于抽象类中,而子类必须重写,除非子类也是抽象的。
override 实现
override 方法提供从基类继承的成员的新实现。由 override 声明重写的方法称为重写基方法。重写的基方法必须与 override 方法具有相同的签名。不能重写非虚方法或静态方法。重写的基方法必须是 virtual、abstract 或 override 的。 override 声明不能更改 virtual 方法的可访问性。 override 方法和 virtual 方法必须具有相同的访问级别修饰符。重写属性声明必须指定与继承属性完全相同的访问修饰符、类型和名称,并且被重写的属性必须是 virtual、abstract 或 override 的。
总结:父类有abstract的方法里,子类一定要对该方法override,而virtual的方法,可以不用.