封装、继承、多态

本文介绍了面向对象编程的三大核心概念:封装、继承和多态。详细解析了如何通过封装保护数据,利用继承重用代码,以及借助多态提高程序灵活性。

一、封装:

  封装是实现面向对象程序设计的第一步,封装就是将数据或函数等集合在一个个的单元中(我们称之为类)。被封装的对象通常被称为抽象数据类型。 

 封装的意义:
  封装的意义在于保护或者防止代码(数据)被我们无意中破坏。在面向对象程序设计中数据被看作是一个中心的元素并且和使用它的函数结合的很密切,从而保护它不被其它的函数意外的修改。

  封装提供了一个有效的途径来保护数据不被意外的破坏。相比我们将数据(用域来实现)在程序中定义为公用的(public)我们将它们(fields)定义为私有的(privat)在很多方面会更好。私有的数据可以用两种方式来间接的控制。第一种方法,我们使用传统的存、取方法。第二种方法我们用属性(property)。

  使用属性不仅可以控制存取数据的合法性,同时也提供了“读写”、“只读”、“只写”灵活的操作方法。

访问修饰符:

Private:只有类本身能存取.
Protected:类和派生类可以存取.
Internal:只有同一个项目中的类可以存取.
Protected Internal:是Protected和Internal的结合. 
Public:完全存取.

 二、继承:

  继承主要实现重用代码,节省开发时间。

1、C#中的继承符合下列规则:

    1. 继承是可传递的。如果C从B中派生,B又从A中派生,那么C不仅继承了B中声明的成员,同样也继承了A中的成员。Object类作为所有类的基类。
    2. 派生类应当是对基类的扩展。派生类可以添加新的成员,但不能除去已经继承的成员的定义。
    3. 构造函数和析构函数不能被继承。除此之外的其它成员,不论对它们定义了怎样的访问方式,都能被继承。基类中成员的访问方式只能决定派生类能否访问它们。
    4. 派生类如果定义了与继承而来的成员同名的新成员,就可以覆盖已继承的成员。但这并不因为这派生类删除了这些成员,只是不能再访问这些成员。
    5. 类可以定义虚文法、虚属性以及虚索引指示器,它的派生类能够重载这些成员,从而实现类可以展示出多态性。

  2、new关键字

   如果父类中声明了一个没有friend修饰的protected或public方法,子类中也声明了同名的方法。则用new可以隐藏父类中的方法。(不建议使用)

  3、base关键字

   base 关键字用于从派生类中访问基类的成员:

    1. 调用基类上已被其他方法重写的方法。
    2. 指定创建派生类实例时应调用的基类构造函数。

三、多态

  1、多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。

  编译时的多态性:

  编译时的多态性是通过重载来实现的。对于非虚的成员来说,系统在编译时,根据传递的参数、返回的类型等信息决定实现何种操作。 

  运行时的多态性:

  运行时的多态性就是指直到系统运行时,才根据实际情况决定实现何种操作。C#中,运行时的多态性通过虚成员实现。 

  编译时的多态性为我们提供了运行速度快的特点,而运行时的多态性则带来了高度灵活和抽象的特点。

   2、实现多态:

    1. 接口多态性。
    2. 继承多态性。
    3. 通过抽象类实现的多态性。

  3、override关键字:

   重写父类中的virtual修饰的方法,实现多态。

### 封装继承多态的概念及其用法 #### 1. 封装 封装是一种将数据(属性)和操作数据的方法绑定在一起的机制,同时隐藏对象的内部实现细节[^1]。通过封装,对象的外部只能通过公开的接口与对象交互,而无法直接访问其内部状态。这种设计可以保护对象的数据不被外部代码随意修改。 以下是封装的一个简单示例: ```cpp class Person { private: std::string name; int age; public: // 设置名称 void setName(const std::string& newName) { name = newName; } // 获取名称 std::string getName() const { return name; } // 设置年龄 void setAge(int newAge) { if (newAge > 0 && newAge < 120) { age = newAge; } else { std::cout << "Invalid age!" << std::endl; } } // 获取年龄 int getAge() const { return age; } }; ``` 在这个例子中,`name` 和 `age` 是私有成员变量,不能直接从类外部访问。取而代之的是提供公共方法(如 `setName` 和 `getName`)来间接访问和修改它们[^1]。 #### 2. 继承 继承是面向对象编程中的一个重要特性,允许一个类(子类)继承另一个类(父类)的属性和方法[^2]。通过继承,子类可以重用父类的代码,同时还可以扩展或修改父类的行为。 继承的基本形式如下: - 子类继承父类的所有非私有成员。 - 子类可以添加新的成员或覆盖父类的成员。 - 使用 `super` 或 `this` 关键字可以显式访问父类的成员[^3]。 以下是一个继承的例子: ```cpp class Animal { public: void eat() { std::cout << "This animal is eating." << std::endl; } }; class Dog : public Animal { public: void bark() { std::cout << "The dog is barking." << std::endl; } }; int main() { Dog myDog; myDog.eat(); // 调用从父类继承的方法 myDog.bark(); // 调用子类自己的方法 return 0; } ``` 在这个例子中,`Dog` 类继承了 `Animal` 类的 `eat` 方法,并且还定义了自己的 `bark` 方法[^2]。 #### 3. 多态 多态是指同一个接口可以表示不同的类型或行为的能力。多态的主要作用是解决程序中函数重载的问题,允许将父对象设置为与其一个或多个子对象相等的技术,从而根据当前赋值给它的子对象的特性以不同的方式运作。 多态通常通过虚函数(virtual function)实现。虚函数允许在基类中声明一个函数,并在派生类中重新定义它。当通过基类指针或引用调用虚函数时,实际调用的是派生类中定义的版本。 以下是一个多态的例子: ```cpp class Shape { public: virtual void draw() { std::cout << "Drawing a generic shape." << std::endl; } virtual ~Shape() {} // 虚析构函数确保正确释放内存 }; class Circle : public Shape { public: void draw() override { std::cout << "Drawing a circle." << std::endl; } }; class Rectangle : public Shape { public: void draw() override { std::cout << "Drawing a rectangle." << std::endl; } }; void drawShape(Shape* shape) { shape->draw(); } int main() { Circle circle; Rectangle rectangle; drawShape(&circle); // 输出: Drawing a circle. drawShape(&rectangle); // 输出: Drawing a rectangle. return 0; } ``` 在这个例子中,`Shape` 是一个基类,`Circle` 和 `Rectangle` 是派生类。通过基类指针调用 `draw` 方法时,实际调用的是派生类中定义的版本,这体现了多态的特性。 #### 4. 面向对象编程概念 面向对象编程(OOP)是一种以对象为中心的编程范式,强调将数据和操作数据的逻辑封装在一起。OOP 的核心思想包括封装继承多态,这些特性共同支持代码的可重用性、可扩展性和可维护性[^2]。 封装提供了数据的保护,确保对象的状态只能通过公共接口访问。继承允许类之间的层次结构,促进代码重用和逻辑分类。多态通过共享接口使得不同类型的对象可以被统一处理,增强了程序的灵活性[^1]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值