继承、封装、多态

一、封装:

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

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

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

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

访问修饰符:

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

二、继承:

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

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

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

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

  3、base关键字

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

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

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

  编译时的多态性:

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

  运行时的多态性:

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

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

  2、实现多态:

接口多态性。
继承多态性。
通过抽象类实现的多态性。
  3、override关键字:

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

原文:
http://www.cnblogs.com/mountain-mist/articles/1214996.html

### 面向对象编程中的继承封装多态 #### 继承 继承面向对象编程中的一个核心概念,它允许一个类(子类)从另一个类(父类)中继承属性和方法。通过继承,子类可以复用父类的代码,同时也可以扩展或重写父类的功能。继承有助于构建清晰的类层次结构,减少代码重复,提高代码的可维护性。 以下是一个使用Python实现继承的示例: ```python class Animal: def __init__(self, name): self.name = name def speak(self): return "Some sound" class Dog(Animal): def speak(self): return "Woof!" class Cat(Animal): def speak(self): return "Meow!" dog = Dog("Buddy") cat = Cat("Kitty") print(dog.speak()) # 输出: Woof! print(cat.speak()) # 输出: Meow! ``` 上述代码展示了如何通过继承实现子类对父类方法的重写[^2]。 #### 封装 封装面向对象编程中的另一个重要特性,它指的是将数据(属性)和操作数据的方法绑定在一起,并隐藏对象的内部实现细节。通过封装,对象的内部状态受到保护,外部只能通过定义好的接口访问或修改对象的状态。这确保了数据的安全性和完整性。 在Python中,可以通过使用`_`或`__`前缀来定义受保护或私有的属性和方法。例如: ```python class BankAccount: def __init__(self, owner, balance=0): self.owner = owner self.__balance = balance # 私有属性 def deposit(self, amount): if amount > 0: self.__balance += amount print(f"Deposited {amount}. New balance: {self.__balance}") else: print("Deposit amount must be positive.") def withdraw(self, amount): if 0 < amount <= self.__balance: self.__balance -= amount print(f"Withdrew {amount}. New balance: {self.__balance}") else: print("Invalid withdrawal amount.") account = BankAccount("Alice", 100) account.deposit(50) # 输出: Deposited 50. New balance: 150 account.withdraw(30) # 输出: Withdrew 30. New balance: 120 # 尝试直接访问私有属性会引发错误 # print(account.__balance) # 报错 ``` 此示例展示了如何通过封装保护对象的内部状态[^3]。 #### 多态 多态是指同一个方法调用可以在不同的对象上表现出不同的行为。在面向对象编程中,多态通常通过继承和方法重写实现。父类的引用可以指向子类的对象,从而实现动态绑定。这意味着即使引用类型是父类,实际执行的方法取决于对象的实际类型。 以下是一个展示多态的示例: ```python class Shape: def area(self): pass class Rectangle(Shape): def __init__(self, width, height): self.width = width self.height = height def area(self): return self.width * self.height class Circle(Shape): def __init__(self, radius): self.radius = radius def area(self): return 3.14159 * self.radius ** 2 def print_area(shape): print(f"Area: {shape.area()}") shapes = [Rectangle(5, 3), Circle(4)] for shape in shapes: print_area(shape) # 分别输出矩形和圆形的面积 ``` 在此示例中,`print_area`函数接受一个`Shape`类型的参数,但由于多态的存在,它可以处理不同类型的子类对象[^4]。 ### 总结 继承封装多态面向对象编程的核心特性。继承促进代码复用,封装保护对象的内部状态,而多态使代码更加灵活和通用。这些特性共同作用,帮助开发者构建模块化、可维护和可扩展的软件系统。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值