抽象类:abstract
抽象类中的抽象属性和抽象方法都必须是公有的(public修饰符),
子类必须重写抽象类中所有的抽象属性和抽象方法如果没有全部重写(override)子类就必须声明为抽象类
有抽象 方法或抽象属性的类一定是抽象类,抽象类中的属性或方法不一定都是抽象的。
抽象类无法实例化,抽象类不能有方法主体,抽象方法也是虚拟的但是不需要提供关键字virtual
接口:interface
1.接口不能被实例化。
2.接口本身没有具体实现,具体实现是派生接口或者派生类的事。
3.接口支持多重继承。
4.接口没有构造函数。
5.接口中的所有成员默认为public,派生类必须实现接口中的所有成员。
抽象类和接口的异同:
1.抽象类不能被密封(sealed)
2.抽象类实现的具体方法默认为虚的,但是实现接口的类中的方法默认为非虚的。
3.抽象类把类当做对象,而接口只是一个行为的规范或规定。
4.一个类一次只能继承一个类但是可以实现多个接口
5.抽象类和接口都实现了oop中的一个原则,把可变的和不可变的分离
6.抽象类和接口都可以被继承,都不能被实例化,派生类都必须实现未实现的方法。
7.抽象类主要是满足事物的内部共性,而接口主要是满足事物的外部特性(比如说实现某一个功能),人和都属于动物,动物就可以定义为抽象类,而吃就可以定义为接口
8.接口中不能包含字段但是抽象类可以包含。
1 class FruitAbstract 2 { 3 } 4 public abstract class Fruit 5 { 6 public string vendor { get; set; } 7 public abstract float Price { get; } 8 public abstract void GrowInArea() ; 9 10 } 11 public class Apple : Fruit 12 { 13 public override float Price { 14 get { if (vendor == "红富士") 15 return 100; 16 else 17 return 0; 18 } 19 } 20 public override void GrowInArea() 21 { 22 Console.WriteLine("我在南方北方都能生长,我的厂商是:" + vendor + ",我的价格是:" + Price); 23 } 24 25 } 26 public class Orange : Fruit { 27 public override float Price 28 { 29 get 30 { 31 return 0; 32 } 33 } 34 public override void GrowInArea() 35 { 36 Console.WriteLine("我只能生长在南方,我的厂商是:" + vendor + ",我的价格是:" + Price); 37 } 38 } 39 class test 40 { 41 static void Main(string[] args) 42 { 43 Fruit f = new Apple(); 44 f.vendor = "红富士"; 45 f.GrowInArea(); 46 f = new Orange(); 47 f.vendor = "柑橘"; 48 f.GrowInArea(); 49 Console.Read(); 50 } 51 } 52 abstract class AbstractClass 53 { 54 public abstract void Av1(); 55 56 } 57 interface a { 58 int aaa=1; 59 }
详见:https://www.cnblogs.com/sunzhenyong/p/3814910.html