C#中关于“接口,抽象类,类”
2014-02-27 17:36
288 查看
三个的抽象等级依次递减:
1、接口是最抽象的;
2、抽象类可以实现接口,并且添加一些默认的实现;
3、类必须是实现具体的功能,不可以有抽象方法等,但是可以有虚方法;
abstract
修饰符指示所修饰的内容缺少实现或未完全实现。 abstract 修饰符可用于类、方法、属性、索引器和事件。
在类声明中使用 abstract 修饰符以指示某个类只能是其他类的基类。
标记为抽象或包含在抽象类中的成员必须通过从抽象类派生的类来实现。
示例
在此例中,类 Square 必须提供
Area 的实现,因为它派生自 ShapesClass:
C#
抽象类具有以下特性:
抽象类不能实例化。
抽象类可以包含抽象方法和抽象访问器。
不能用 sealed(C# 参考) 修饰符修饰抽象类,因为这两个修饰符的含义是相反的。
采用 sealed 修饰符的类无法继承,而
abstract 修饰符要求对类进行继承。
从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实际实现。
在方法或属性声明中使用 abstract 修饰符以指示方法或属性不包含实现。
抽象方法具有以下特性:
抽象方法是隐式的虚方法。
只允许在抽象类中使用抽象方法声明。
因为抽象方法声明不提供实际的实现,所以没有方法体;方法声明只是以一个分号结束,并且在签名后没有大括号 ({ })。
例如:
实现由一个重写方法override(C# 参考)提供,此重写方法是非抽象类的一个成员。
在抽象方法声明中使用
static 或
virtual 修饰符是错误的。
除了在声明和调用语法上不同外,抽象属性的行为与抽象方法一样。
在静态属性上使用 abstract 修饰符是错误的。
在派生类中,通过包括使用
override 修饰符的属性声明,可以重写抽象的继承属性。
有关抽象类的更多信息,请参见抽象类、密封类及类成员(C# 编程指南) 和抽象类设计。
抽象类必须为所有接口成员提供实现。
实现接口的抽象类可以将接口方法映射到抽象方法上。
例如:
C#
在本例中,DerivedClass 类是从抽象类
BaseClass 派生的。
抽象类包含一个抽象方法 AbstractMethod 和两个抽象属性 X 和
Y。
C#
在上面的示例中,如果尝试通过使用下面的语句将抽象类实例化:
将出现错误,指出编译器无法创建抽象类“BaseClass”的实例。
1、接口是最抽象的;
2、抽象类可以实现接口,并且添加一些默认的实现;
3、类必须是实现具体的功能,不可以有抽象方法等,但是可以有虚方法;
abstract
修饰符指示所修饰的内容缺少实现或未完全实现。 abstract 修饰符可用于类、方法、属性、索引器和事件。
在类声明中使用 abstract 修饰符以指示某个类只能是其他类的基类。
标记为抽象或包含在抽象类中的成员必须通过从抽象类派生的类来实现。
示例
在此例中,类 Square 必须提供
Area 的实现,因为它派生自 ShapesClass:
C#
abstract class ShapesClass { abstract public int Area(); } class Square : ShapesClass { int side = 0; public Square(int n) { side = n; } // Area method is required to avoid // a compile-time error. public override int Area() { return side * side; } static void Main() { Square sq = new Square(12); Console.WriteLine("Area of the square = {0}", sq.Area()); } interface I { void M(); } abstract class C : I { public abstract void M(); } } // Output: Area of the square = 144
抽象类具有以下特性:
抽象类不能实例化。
抽象类可以包含抽象方法和抽象访问器。
不能用 sealed(C# 参考) 修饰符修饰抽象类,因为这两个修饰符的含义是相反的。
采用 sealed 修饰符的类无法继承,而
abstract 修饰符要求对类进行继承。
从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实际实现。
在方法或属性声明中使用 abstract 修饰符以指示方法或属性不包含实现。
抽象方法具有以下特性:
抽象方法是隐式的虚方法。
只允许在抽象类中使用抽象方法声明。
因为抽象方法声明不提供实际的实现,所以没有方法体;方法声明只是以一个分号结束,并且在签名后没有大括号 ({ })。
例如:
public abstract void MyMethod();
实现由一个重写方法override(C# 参考)提供,此重写方法是非抽象类的一个成员。
在抽象方法声明中使用
static 或
virtual 修饰符是错误的。
除了在声明和调用语法上不同外,抽象属性的行为与抽象方法一样。
在静态属性上使用 abstract 修饰符是错误的。
在派生类中,通过包括使用
override 修饰符的属性声明,可以重写抽象的继承属性。
有关抽象类的更多信息,请参见抽象类、密封类及类成员(C# 编程指南) 和抽象类设计。
抽象类必须为所有接口成员提供实现。
实现接口的抽象类可以将接口方法映射到抽象方法上。
例如:
C#
interface I { void M(); } abstract class C : I { public abstract void M(); }
在本例中,DerivedClass 类是从抽象类
BaseClass 派生的。
抽象类包含一个抽象方法 AbstractMethod 和两个抽象属性 X 和
Y。
C#
abstract class BaseClass // Abstract class { protected int _x = 100; protected int _y = 150; public abstract void AbstractMethod(); // Abstract method public abstract int X { get; } public abstract int Y { get; } } class DerivedClass : BaseClass { public override void AbstractMethod() { _x++; _y++; } public override int X // overriding property { get { return _x + 10; } } public override int Y // overriding property { get { return _y + 10; } } static void Main() { DerivedClass o = new DerivedClass(); o.AbstractMethod(); Console.WriteLine("x = {0}, y = {1}", o.X, o.Y); } } // Output: x = 111, y = 161
在上面的示例中,如果尝试通过使用下面的语句将抽象类实例化:
BaseClass bc = new BaseClass(); // Error
将出现错误,指出编译器无法创建抽象类“BaseClass”的实例。
相关文章推荐
- 关于C#中抽象类与接口的看法与理解
- C#关于类抽象类和接口之间的关系(Abstract)(Interface)
- 关于C#接口和抽象类使用原则
- 关于C#的抽象类与接口
- 关于C#继承中 接口、抽象类、普通子类 微妙关系
- c#学习笔记一 关于接口的几个疑问
- Head First C# 中文版 图文皆译 第七章 接口和抽象类 page269
- C#抽象类和接口的区别
- Head First C# 中文版 图文皆译 第七章 接口和抽象类 page276
- .天轰穿C# -vs2010 - 04面向对象的编程之接口 VS 抽象类 【原创】
- 关于接口与抽象类
- 关于C#接口的使用
- Head First C# 中文版 图文皆译 第七章 接口和抽象类 page285
- 关于抽象类和接口
- 编写高质量代码改善C#程序的157个建议——建议102:区分接口和抽象类的应用场合
- Head First C# 中文版 图文皆译 第七章 接口和抽象类 page294
- Head First C# 中文版 图文皆译 第七章 接口和抽象类 page297
- c#抽象类和接口的区别
- C#温故而知新学习系列之面向对象编程—接口和抽象类的区别是什么?(十八)
- C#抽象类和接口的区别