封装、继承、多态的优缺点

面向对象的三大特征:封装、继承、多态

封装:每个对象都包含它能进行操作所需要的所有信息,这个特征成为封装。

封装的好处:

(1)良好的封装能够减少耦合(代码与界面)

(2)类内部的实现可以自由修改的

(3)类具有清晰的对外接口(确定内容的访问属性,是公有还是私有;字段是只读、只写或者是可读可写等)

继承:使子类拥有父类非private的属性和功能,子类还具有自己的属性和功能,同时子类还可以改写父类中的功能(方法重写、与多态有关)

继承的好处:

(1)继承使得所有的子类的公共部分都放在了父类中,使得代码得到了共享。提高了代码的重用性,避免了重复。

(2)继承可使得修改或扩展继承而来的实现都较为容易

(3)使类与类之间产生联系,为多态提供了前提

继承的缺点:

(1)继承具有入侵性(即继承必须拥有父类的所有非私有属性和方法)

(2)父类变,子类变

(2)继承破坏封装,父类实现细节暴露给子类,增大了两个类之间的耦合性

耦合性也叫块间关系。指软件系统结构中各个模块间相互联系紧密程度的一种量度。模块之间联系越紧密,其耦合性就越强,模块的独立性则越差,模块间耦合的高低取决于模块间杰克的复杂性,调用的方式以及传递的信息。例如在这里继承就是一种类和类之间强耦合的关系。

多态(面向对象的核心):指相同的操作或者函数、过程可作用于多种类型的对象上并获得不同的结果;不同的对象,收到同一消息可以产生不同的结果。多态性通过派生类重载基类中的虚函数型方法来实现

多态的前提:

(1)必须要有抽象类或者接口,或者说要有抽象方法或者接口方法

(2)子类继承了抽象类或者接口,并且对抽象类或接口中的抽象方法进行了重写

(3)子类对象必须赋给父类对象,用父类对象去调用子类对象中重写的抽象方法

多态的优点:

(1)提高了代码的维护性(继承保证)

(2)提高了代码的可扩展性(有多态保证)

多态需要注意的地方:

(1)要实现多态,对象的声明必须是父类,而不是子类,实例化的对象是子类

(2)虚方法是按照其运行时的类型而非编译时类型进行动态绑定调用的

静态多态性和动态多态性:

(1)静态多态性——编译时的多态性

实现方式:重载

(2)动态多态性——运行时的多态性(只直到系统运行时,才根据实际情况决定实现何种操作)

实现方式:虚函数

<think>嗯,用户想了解C#中的封装继承多态,需要示例和实现。首先,我得回忆一下这三个概念的定义和它们在C#中的具体应用。封装主要是隐藏内部细节,通过访问修饰符来控制,比如private、public这些。继承的话,C#用的是类继承,子类可以继承父类的属性和方法。多态比较复杂,有静态多态和动态多态,静态可能指方法重载,动态则是通过虚方法和重写实现的。 接下来,我需要考虑用户可能的实际需求。他们可能想看到具体的代码示例,这样更容易理解。比如封装的例子可以用一个类,里面有私有字段和公共属性。继承的话,可以展示一个基类和子类的关系。多态可能需要用虚方法或者接口来演示不同对象调用相同方法的不同行为。 然后,要注意引用之前提供的资料。用户给出的引用里提到多态通过虚方法、抽象类和接口实现,所以示例中应该涵盖这些方面。比如,在动态多态部分,使用虚方法和override关键字,或者用接口来展示多态性。 还要确保代码的正确性,比如在C#中,继承是用冒号,子类构造函数调用基类构造函数用base关键字。多态中的方法重写需要virtual和override配对使用。接口的实现则是用implicit方式还是显式方式,这里可能需要简单说明。 另外,用户可能需要了解这三个概念的实际应用场景,比如封装用于数据保护,继承用于代码复用,多态用于提高代码的灵活性和可扩展性。在示例中,可以提到这些优点,帮助用户理解为什么使用这些特性。 最后,生成的相关问题要覆盖常见疑惑,比如封装的安全性,继承优缺点多态的实现方式比较等。这样用户如果有进一步的问题,可以引导他们深入探讨。</think>### C# 封装继承多态的实现与示例 #### 一、封装(Encapsulation) **定义**:封装通过隐藏对象内部细节并控制访问权限,实现数据安全和代码模块化。 **实现方式**:使用访问修饰符(`private`/`public`/`protected`)和属性(`get`/`set`)。 **示例**: ```csharp public class BankAccount { private decimal _balance; // 私有字段,外部无法直接访问 public decimal Balance { get { return _balance; } set { if (value >= 0) _balance = value; } } public void Deposit(decimal amount) { if (amount > 0) _balance += amount; } } ``` **特点**: - 数据验证通过`set`实现(如禁止负余额)[^2] - 方法`Deposit`封装存款逻辑 --- #### 二、继承(Inheritance) **定义**:子类继承父类属性和方法,实现代码复用和层次化设计。 **实现方式**:使用`:`符号声明继承关系。 **示例**: ```csharp public class Animal { public string Name { get; set; } public void Eat() => Console.WriteLine("Eating..."); } public class Dog : Animal { // 继承Animal类 public void Bark() => Console.WriteLine("Woof!"); } ``` **调用**: ```csharp Dog myDog = new Dog(); myDog.Eat(); // 继承自父类 myDog.Bark(); // 子类特有方法 ``` --- #### 三、多态(Polymorphism) ##### 1. 动态多态(虚方法) **实现方式**:通过`virtual`和`override`实现运行时多态[^3]。 **示例**: ```csharp public class Shape { public virtual void Draw() => Console.WriteLine("Drawing a shape"); } public class Circle : Shape { public override void Draw() => Console.WriteLine("Drawing a circle"); } ``` **调用**: ```csharp Shape shape = new Circle(); shape.Draw(); // 输出"Drawing a circle" ``` ##### 2. 接口多态 **实现方式**:通过接口定义契约,不同类实现相同接口[^3]。 **示例**: ```csharp public interface ILogger { void Log(string message); } public class FileLogger : ILogger { public void Log(string message) => Console.WriteLine($"File: {message}"); } public class DatabaseLogger : ILogger { public void Log(string message) => Console.WriteLine($"Database: {message}"); } ``` **调用**: ```csharp ILogger logger = new FileLogger(); logger.Log("Test"); // 输出"File: Test" ``` --- #### 综合应用场景 1. **封装**:保护敏感数据(如银行账户余额) 2. **继承**:构建UI控件层次(如`Button`继承自`Control`) 3. **多态**:实现插件系统(通过接口统一调用不同插件) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值