重温:面向对象的程序设计

重温:面向对象的程序设计
封装(encapsulation)
就是把类的内部隐藏起来,以防止外部世界看见的一个面向对象的概念。
数据隐藏是封装最有用的方式之一,实现方法-访问限制修饰符
public 无限制,允许任何人来访问
protected internal  = protected + internal
Internal 允许项目或程序内部的类来访问
protected 继承时子类可以对基类有完全访问权
private 只允许同一个类中的成员访问

继承性(inheritance)
一个类可以有能力直接从另一个类获得其代码和数据。
把现有的类称为基类或父类,把派生出的类称为派生类和子类。派生类从基类那里获得其所有的成员
public class InsuranceAccount : Account
在C#中只允许单继承,就是子类有且仅有一个父类,所有这样的继承关系是一对一的。

如何访问基类成员?
通过使用base关键字;
派生类在访问基类的时候有一定的限制,不能访问 private 的成员;internal的基类成员只能被同一个程序集中的派生类访问;
多层继承调用:base.base.…….x;
用基类的对象引用来直接实例化子类的对象是可以的;如:(基类)Account acc = new CheckAccount();(可以说鸟就是动物) 反过来则是不可以的,如:CheckAccount ca2 = acc,这是不对的(不能说动物就是鸟)。 
但是,允许用Solution: 数据类型转换进行强制类型转换,如:Account acc = new CheckAccount(),CheckAccount chk = (CheckAccount) acc,如果acc不是CheckAccount的对象,那么运行时就将抛出 System.InvalidCastException

多态性
在运行时,可以通过指向基类的引用,来调用实现派生类中的方法。
同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。多态性通过派生类覆写基类中的虚函数型方法来实现。

C#支持两种类型的多态性:
1、编译时的多态性:编译时的多态性是通过重载来实现的。对于非虚的成员来说,系统在编译时,根据传递的参数、返回的类型等信息决定实现何种操作。
2、运行时的多态性:运行时的多态性就是指直到系统运行时,才根据实际情况决定实现何种操作。C#中,运行时的多态性通过虚成员实现。
编译时的多态性为我们提供了运行速度快的特点,而运行时的多态性则带来了高度灵活和抽象的特点。

重载(Overload)
特点:(两必须一可以)
方法名必须相同;
参数列表必须不相同;
返回值类型可以不相同。
广泛的用于类的构造器。

虚函数
使用virtual关键字声明 public virtual bool Withdraw(…){};
调用虚函数,运行时将确定调用对象是什么类的实例,并调用适当的覆写的方法。
虚方法和其他方法是一致的,没有太多的区别,只不过有virtual关键字,可以被覆写,可以有实现体,也就是说在里面可以有方法的定义;

覆写(Override)
子类中为满足自己的需要来重复定义某个方法的不同实现
使用关键字override来覆写(只有虚方法和抽象方法才能被覆写)
public override bool Withdraw(…)
要求: (三相同)
相同的方法名称
相同的参数列表
相同的返回值类型

Override VS Overload比较
Items            Override 覆写                 Overload 重载
位置       存在于继承关系的类中
                 (覆写父类中的方法)                存在于同一类中
方法名                相同                                     相同
参数列表   相同                                 必须不同
返回值                相同                                 可以不相同

抽象方法:是必须一定被派生类覆写的方法。
可以看成是没有实现体的虚方法;publc abstract bool Withdraw(…);没有{}。
如果类中包含抽象方法,那么类就必须定义为抽象类,不论是否还包含其它一般方法。
何时使用继承?
代码重用,减少编写的代码量;
设计重用:
公用的字段和方法可以放到父类中,然后由其派生新的子类,子类有自己的字段和方法。
经验而言——”is a”的关系:
如果A类是从B类中继承而来,即A是B的子类,那么我们可以说:“class A is-a class B”。
 
接口:
接口为类提供了蓝图;
接口只提供定义;
实现接口的数据类型必须提供接口成员的实现;
接口本身可以从多个基接口派生;
使用interface关键字
public interface IAccount
{
 void Method1();
 string Method2(int x, int y);
 .
}
Public class InsuranceAccount : IAccount
{
 void Method1()
 {
  …
 }
 string Method2(int x, int y)
 {
  …
 }
}
又要继承又要实现接口Public class InsuranceAccount : Account,IAccount;继承一个父类实现多个接口,满足一个多继承的方式。
继承和接口是互补的
“is-a”—— inherits(继承)
“acts-like”—— implements(实现)
设计中经常是两者都使用的
 
抽象类和接口
抽象类里有自己的一般方法和抽象方法
一般设计时用接口(推荐)
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值