在C#中,面向对象编程(OOP)是编程的基本范式,它使用类和对象的概念来构建软件应用程序。面向对象编程的三个主要特性是封装、继承和多态。
封装:封装是将数据(属性)和操作数据的函数(方法)捆绑到一个独立的实体(对象)中。这样做可以隐藏对象的内部状态,并提供一种控制对象外部代码访问该状态的方式。
public class Car
{
public string Model { get; set; }
public int EngineCapacity { get; set; }
public void StartEngine()
{
Console.WriteLine("Engine started.");
}
}
继承:继承是子类自动获得父类所有非私有属性和方法的能力。子类可以添加或覆盖父类的成员。通过继承,可以创建更具体的类,从更一般的类中继承属性和方法。
public class Engine
{
public void Start()
{
Console.WriteLine("Engine started.");
}
}
public class Car : Engine // Car类继承自Engine类
{
public string Model { get; set; }
public int EngineCapacity { get; set; }
}
多态:多态意味着一个接口可以有多种实现方式,或者父类引用可以指向子类对象。多态允许程序在运行时确定对象的具体类型,并据此调用相应的方法。多态性是通过方法重写、接口实现和委托实现的。
interface IShape
{
void Draw();
}
class Circle : IShape
{
public void Draw()
{
Console.WriteLine("Drawing Circle...");
}
}
class Rectangle : IShape
{
public void Draw()
{
Console.WriteLine("Drawing Rectangle...");
}
}
class Program
{
static void Main(string[] args)
{
IShape shape1 = new Circle(); // 引用类型为Circle的IShape对象
IShape shape2 = new Rectangle(); // 引用类型为Rectangle的IShape对象
shape1.Draw(); // 输出 "Drawing Circle..."
shape2.Draw(); // 输出 "Drawing Rectangle..."
}
}
在上面的例子中,IShape
接口定义了一个Draw
方法,Circle
和Rectangle
类都实现了这个接口。在Main
方法中,我们创建了Circle
和Rectangle
类的实例,并分别通过IShape
接口的引用进行调用。由于多态性,程序在运行时根据实际对象的类型来调用相应的方法。
除了接口,委托也是实现多态性的一种方式。委托是一种类型安全的函数指针,允许你指向具有相同签名的任何方法。
public delegate void MyDelegate(string message);
public class Program
{
public static void Main(string[] args)
{
MyDelegate del = new MyDelegate(ShowMessage);
del("Hello World"); // 输出 "Hello World"
del = new MyDelegate(ShowMessage2);
del("Hello C#"); // 输出 "Hello C#"
}
public static void ShowMessage(string message)
{
Console.WriteLine(message);
}
public static void ShowMessage2(string message)
{
Console.WriteLine($"{message.ToUpper()} C#");
}
}
在这个例子中,我们定义了一个名为MyDelegate
的委托,它接受一个字符串作为参数。Main
方法中创建了两个委托实例,一个指向ShowMessage
方法,另一个指向ShowMessage2
方法。当我们通过委托调用方法时,会根据实际指向的方法来执行相应的逻辑。
多态性是面向对象编程中非常强大的特性,它允许我们编写更灵活、可扩展的代码,并能够以更自然的方式表达现实世界中的概念。通过使用继承和接口,我们可以构建具有共同特性的类层次结构,并通过多态性在不同的类实例上执行相同的操作,而具体实现可以在运行时确定。