一个类可以继承自一个祖先类(否则是 Object,所有的根)。
它还可以实现一些接口(或没有)。
一个类可以有未实现的抽象成员,因此该类是抽象的。
成员也可以是虚拟的以启用多态性(抽象成员是)。
一旦实现,类中就有一个东西可用,即使不是抽象的也可以被实例化,并且对所有子类也可用,除了那些隐藏在子类中的私有对象。
无需重复,这就是 OOP 的力量之一。
这样做,使用抽象,封装,继承和多态,在研究了现实世界和我们工作的领域之后,我们可以设计这个现实世界的投影,我们脑海中的一个视图,具有数据的概念(字段和属性)和操作(方法),分为工件(对象)和关系、组合、聚合、接口、组件、控件等。
因此我们可以将处理分解为不重复,例如:
- 有一个
Animal 类和Cat 和Dog 子类,
- 我们在动物中添加了
Size 和Color 方面,
- 以及为所有动物实现的
Eat 和 Walk 方法,
- 还有一个未实现的抽象
DoSound。
因此:
- 在具体的类
Cat 和Dog 中我们不再实现这些东西,
-
DoSound 除外,它适用于每种真实的动物性别。
关于接口,它们是虚拟合约。
例如,我们可以让动物和建筑物乍一看没有任何共同之处(我们不会回到原子和光子),但我们也希望能够管理像猫和狗这样的对象实例作为房子和博物馆拍照。
为了实现我们定义了一个接口IPhotoTaking,并且在定义以前的类时,我们添加了它们实现了这个接口。
代码示例:
public interface IPhotoTaking
{
Image TakePhoto();
}
public abstract class Animal : IPhotoTaking
{
public int Size { get; set; }
public Color Color { get; set; }
public void Eat() { ... }
public void Walk() { ... }
public abstract void DoSOund();
public Image TakePhoto();
}
public class Cat : Animal // no need to repeat IPhotoTaking
{
public override void DoSound() { ... }
}
public class Dog : Animal
{
public override void DoSound() { ... }
}
public abstract class Building :IPhotoTaking
{
public Image TakePhoto();
}
public class House : Building
{
}
public class Museum : Building
{
}
现在有了这个列表,我们可以像这样使用多态性:
var animals = new List<Animal>();
foreach ( var animal in animals )
animal.DoSound();
同样没有多态性,并且由于 C# 不支持真正的多态性,钻石运算符尚未应用于 List<> 这里,我们可以使用这样的接口:
var items = new List<IPhotoTaking>();
foreach ( var item in items )
item.TakePhoto();
备注:如果每种类型的拍照可能不同,我们可以将其设置为 virtual 以专门针对每种类型的实现。
OOP Basic Principles
What is abstraction in C#?
How to choose between public, private and protected access modifier?
Association, Composition and Aggregation
What is polymorphism?
What is the difference between an interface and a class?
About the lack of true generic polymorphism and the missing diamond operator in C#