C#编程知识小总结 - [C#研习]
自己对于一些基础的知识还是掌握得不够好,把在编程时遇到的小问题总结下来,也方便以后自己知识盲点的回顾。
- 虚方法与抽象方法的区别;
- 接口类与抽象类的区别;
- To Be Continued
1.虚方法与抽象方法的区别
(1)虚方法必须有实现部分,抽象方法没有提供实现部分,抽象方法是一种强制派生类覆盖的方法,否则派生类将不能被实例化。如:
//抽象方法 public abstract class Animal { public abstract void Sleep(); public abstract void Eat(); } //虚方法 public class Animal { public virtual void Sleep(){} public virtual void Eat(){} }
(2)抽象方法只能在抽象类中声明,虚方法不是。其实如果类包含抽象方法,那么该类也是抽象的,也必须声明为抽象的。如:
public class Animal { public abstract void Sleep(); public abstract void Eat(); }
编译器会报错:
Main.cs(10): 'VSTest.Animal.Sleep()' is abstract but it is contained in nonabstract class 'VSTest.Animal'
Main.cs(11): 'VSTest.Animal.Eat()' is abstract but it is contained in nonabstract class 'VSTest.Animal'
(3) 抽象方法必须在派生类中重写,这一点跟接口类似,虚方法不必。如:
public abstract class Animal { public abstract void Sleep(); public abstract void Eat(); } public class Cat : Animal { public override void Sleep() { Console.WriteLine( "Cat is sleeping" ); } // we need implement Animal.Eat() here }
编译器会报错:Main.cs(14): 'VSTest.Cat' does not implement inherited abstract member 'VSTest.Animal.Eat()',因为我们没有实现抽象类中所有抽象方法。
(4)虚函数可以实现多态,而抽象函数不行。
2.接口类与抽象类的区别
首先抽象类是一种特殊的类,它可以含有方法的定义和实现,也可以包含属性,构造函数等。当然抽象类也可以包含抽象函数和虚函数。 这个是C#三大特性之一多态的重要组成部分。抽象类主要用于关系密切的对象之前,比如铁门和木门都是门,他们都继承自抽象类“门”。重点是“是什么?”一个派生类只能继承至一个类(包括抽象类),派生类必须实现抽象类中定义的虚函数。
而接口是一种引用类型。它只能包含方法的定义但是没有实现。它更多的是起到一个规定的作用。 接口通常用于关系相对不那么紧密但是实现了某种功能的类之间。比如飞机和鸟都会飞,他们都继承自接口“飞”。重点是“能做什么?”一个类可以继承自多个接口,而且必须实现接口中定义的所有成员(包括方法,属性等)。 好的接口应该是具有专一功能的,而不是多功能的,否则造成接口污染。如果一个类只是为了实现这个接口的中一个功能,而不得不去实现接口中的其他方法,就叫接口污染。
前面提到了抽象函数和虚函数,那么这两者之间有什么区别呢? 虚函数是由关键字 virtual 来声明的。它可以包含实现。派生类可以直接使用它的实现也可以覆盖(override)它的实现。 而抽象函数是由关键字abstract来声明的。它不能包含实现。派生类必须实现抽象函数。
@:卿之 → http://www.cnblogs.com/wpdev
©:博文是本人当时的学习笔记及知识整理,由于自身局限错误在所难免,敬请斧正.
©:本文版权属于博客园和本人,版权基于署名 2.5 中国大陆许可协议发布,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接和署名卿之(包含链接),不得删节,否则保留追究法律责任的权利。