一个类可以继承自祖先类(或 Object,所有类的根)。
此外,它可以实现一些接口(或不实现任何接口)。
一个类可以有未实现的成员,被称为抽象成员,这样该类就是抽象类。
成员也可以是虚拟的以启用多态性(抽象成员也是如此)。
一旦实现,一个东西在类中可用,如果不是抽象的,则可以真正地被实例化,并且对于所有子类也是可用的,除了那些被定义为私有的,这些在子类中是隐藏的。
不需要重复,这是面向对象编程的优势之一。
通过使用抽象、封装、继承和多态性,在研究我们工作的真实世界和领域后,我们可以设计一个该真实世界的投影,即我们头脑中的视图,其中的概念具有数据(字段和属性)和操作(方法),分别归类为人造物品(对象)和关系、组合、聚合、接口、组件、控件等。
因此,我们可以将处理过程因素化,以避免重复,例如:
- 有一个
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
{
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();
< p >
备注:如果拍照对于每种类型可能不同,我们可以将其设置为虚拟,以便在每个类型中专门实现它。
面向对象编程基本原则
C#中的抽象是什么?
如何在public、private和protected访问修饰符之间选择?
关联、组合和聚合
多态是什么?
接口和类之间的区别是什么?
C#中缺乏真正的泛型多态性和缺少菱形操作符的问题