文章目录
- 封装 (Encapsulation)
- 继承 (Inheritance)
- 多态 (Polymorphism)
C#中的封装、继承和多态是面向对象编程(OOP)的三大核心特性。下面分别对这三个概念进行深入解释,并通过实例来说明它们在实际开发中的应用。
封装 (Encapsulation)
实例1:
public class BankAccount
{private decimal balance; // 私有变量,封装内部状态public BankAccount(decimal initialBalance){this.balance = initialBalance;}// 公共方法,提供访问私有数据的受控方式public decimal GetBalance(){return balance;}public void Deposit(decimal amount){if (amount > 0)balance += amount;}public void Withdraw(decimal amount){if (amount > 0 && amount <= balance)balance -= amount;}
}
在这个例子中,BankAccount
类封装了账户余额(balance),外部不能直接修改它,只能通过 Deposit
和 Withdraw
方法来进行操作,这样保证了数据的安全性和完整性。
继承 (Inheritance)
实例2:
public class Animal
{public string Name { get; set; }public int Age { get; set; }public virtual void Eat(){Console.WriteLine("动物正在吃东西...");}
}public class Dog : Animal
{public bool IsTrained { get; set; }// 重写父类方法以提供更具体的行为public override void Eat(){Console.WriteLine("狗狗正在吃狗粮...");}public void Bark(){Console.WriteLine("狗狗在叫!");}
}// 使用示例:
Dog myDog = new Dog() { Name = "小黑", Age = 3, IsTrained = true };
myDog.Eat(); // 输出 "狗狗正在吃狗粮..."
myDog.Bark(); // 输出 "狗狗在叫!"
在这里,Dog
类从 Animal
类继承而来,继承了其属性并重写了 Eat
方法,同时添加了一个独有的 Bark
方法,体现了“继承”带来的代码复用和扩展性。
多态 (Polymorphism)
实例3:
public abstract class Shape
{public abstract double Area();
}public class Circle : Shape
{public double Radius { get; set; }public override double Area(){return Math.PI * Radius * Radius;}
}public class Square : Shape
{public double Side { get; set; }public override double Area(){return Side * Side;}
}public static class Program
{public static void DisplayArea(Shape[] shapes){foreach (var shape in shapes){Console.WriteLine($"形状的面积为: {shape.Area()}");}}public static void Main(){var circle = new Circle() { Radius = 5 };var square = new Square() { Side = 10 };Shape[] shapes = { circle, square };DisplayArea(shapes); // 输出不同形状的具体面积}
}
此例中,Circle
和 Square
都是从抽象基类 Shape
派生出来的,它们都实现了 Area
抽象方法。在 DisplayArea
函数中,通过 Shape
类型的数组可以容纳不同类型的形状对象,这是多态性的体现,即同一接口(Area
方法)下不同的实现。
实例4(接口实现多态):
public interface IRunnable
{void Run();
}public class Car : IRunnable
{public void Run(){Console.WriteLine("汽车正在行驶...");}
}public class Airplane : IRunnable
{public void Run(){Console.WriteLine("飞机正在飞行...");}
}public static class Program
{public static void MakeRun(IRunnable vehicle){vehicle.Run();}public static void Main(){Car car = new Car();Airplane airplane = new Airplane();MakeRun(car); // 输出 "汽车正在行驶..."MakeRun(airplane); // 输出 "飞机正在飞行..."}
}
这里展示了通过接口实现多态的例子。IRunnable
接口定义了一个通用行为 Run
,尽管 Car
和 Airplane
的运行方式完全不同,但都可以实现这个接口,从而使得 MakeRun
方法能够处理任何实现了 IRunnable
的对象。
实例5(虚方法与动态绑定):
public class BaseClass
{public virtual void ShowMessage(){Console.WriteLine("这是基础类的消息");}
}public class DerivedClass : BaseClass
{public override void ShowMessage(){Console.WriteLine("这是派生类的消息");}
}public static class Program
{public static void DisplayMessage(BaseClass obj){obj.ShowMessage();}public static void Main(){BaseClass baseObj = new BaseClass();DerivedClass derivedObj = new DerivedClass();DisplayMessage(baseObj); // 输出 "这是基础类的消息"DisplayMessage(derivedObj); // 输出 "这是派生类的消息",尽管传入的是基类引用}
}
这个例子展示了动态多态性,即使通过基类类型引用调用虚方法时,也会根据实际的对象类型调用对应的重写方法。这就是多态的一个重要方面,称为运行时多态或动态绑定。
python推荐学习汇总连接:
50个开发必备的Python经典脚本(1-10)
50个开发必备的Python经典脚本(11-20)
50个开发必备的Python经典脚本(21-30)
50个开发必备的Python经典脚本(31-40)
50个开发必备的Python经典脚本(41-50)
————————————————
最后我们放松一下眼睛