从C#开始,才真正的比较清晰地了解一些OO的特性,抽象、封装、继承、多态等面向对象思想的博大是我们不得不好好总结一下。So,next……
一、抽象。
我们知道,日常生活中的东西都可以描述为对象,比如一个苹果、一个橘子、一根香肠等。结合前边所讲的类图、包图,我们可以得知,水果可以称之为苹果、橘子的类,食物可以称之为苹果、橘子、香肠的包。
那么到底什么是抽象?? 抽象是从众多的事物中抽取出共同的、本质性的特征,而舍弃其非本质的特征。苹果和橘子的共同特性就是水果。
抽象要建立在比较的基础之上,没有比较就无法找出事物的本质特征。而且在抽象时,同与不同,决定于从什么角度上来抽象。抽象的角度取决于分析问题的目的。
说到这里,就不得不谈谈抽象类和接口的问题了。
抽象类:
如上例,苹果、橘子可以抽象为水果类,那谁能说出什么是水果?它是什么颜色,什么形状?既然不能的话…那水果类就是抽象类了~ 因为“水果”一词没有足够的信息来描述一个具体事物。
科学定义:抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。
在类中声明使用abstract修饰符以指示某个类只能是其他类的基类。标记为抽象或包含在抽象类中的成员必须通过从抽象类派生的类来实现。
C#中抽象类特点:1、抽象类不能实例化,其方法必须要通过派生类实现;2、抽象类的派生类必须实现抽象类的方法,否则将产生编译器错误;3、抽象类可以包含抽象方法和抽象访问器;4、不能使用sealed修饰符修改抽象类,即抽象类不能被继承。
抽象方法特点:1、是隐式的虚方法;2、只允许在抽象类中声明;3、因其不提供实现,所以无方法体,声明一分号结束,且在签名后无{};
例:Square子类实现了shapeclass抽象类的Area抽象方法:
abstract class shapeclass //定义抽象类shapeclass {
public abstract int Area();
}
class Square:shapeclass //Square派生类实现shapeclass的Area方法{
int x,y;
public override int Area();
{
return x*y;
}
}
抽象要么是在建立模型后的产物,要么是重构的结果。而抽象是为了解决程序未来的变动,因此抽象出实体后,还需要使用。依赖反转原则告诉了我们如何使用这些抽象产物---编程要依赖于抽象,而不是依赖于具体,即IO(Interface Oriented)。
接口:
接口可以理解为一种契约,无代码的抽象体;它是更加抽象的抽象类,派生于接口的类也要实现接口的全部方法。
例:
public Interface IPict //定义接口IPict
{ int DeleteImage(); void Display(); } public class MyImage:IPict //MyImage类实现IPict接口
{ public int DeleteImage() { console.writeline("DeleteImages 实现!"); } public void Display() { console.writeline("Display 实现!");
} }
多重接口的实现:C#不允许多重类继承,但允许多重接口实现。
例:一个类和两个接口的实现:
Public class Fruit //定义水果抽象类,抽象方法方法为长大 { public void Grew() { Console.Writeline("水果长大!"); } } Public interface IWashFruit //洗水果的接口 { void Wash(); } Public interface IEatFruit //吃水果的接口 { void Eat(); } //实现 Public class MyFruit:Fruit,IWashFruit,IEatFruit //类名、接口名写在一行,逗号分开 { void Grew() { Console.Writeline("IWashFruit 的Wash方法实现了!"); } void Eat() { Console.Writeline("IEatFruit 的Eat方法实现了!"); } } //客户端 Static void Main(String [] arts) { MyFruit objF =new MyFruit(); objF.Grew(); objF.Wash(); objF.Eat(); } //显示结果为:水果长大! // IWashFruit 的Wash方法实现了! // IEatFruit 的Eat方法实现了!
看到王霄总结的这个表格很简洁清晰,特借鉴来弥补一下~~~
下篇为继承、多态分析。