zoukankan      html  css  js  c++  java
  • 第三讲 现代面向对象的程序设计

    面向对象的三个特征
    封装,继承,多态


    数据隐藏
    封装性最有用的方式之一
    实现方法——访问限制修饰符
    public 无限制,允许任何人来访问
    protected internal  = protected + internal
    Internal 允许项目或程序内部的类来访问
    protected 继承时子类可以对基类有完全访问权
    private 只允许同一个类中的成员访问
    属性和索引器也用来封装类的细节,并提供公用接口给该类的用户
    C#默认为private

    如何实现继承?
    public class InsuranceAccount : Account
    C# 中只支持单继承
    防止继承
    public sealed class XX

    如何访问基类成员?
    派生类可以调用基类的方法
    通过使用base关键字
    派生类在访问基类的时候有一定的限制,不能访问 private 的成员;

    internal的基类成员只能被同一个程序集中的派生类访问

    对象引用
    基类可以引用派生类,但派生类不能引用基类。要引用怎么办,数据类型转换。
    Account acc = new CheckAccount()
    CheckAccount chk = acc; //Error
    CheckAccount chk = (CheckAccount) acc;  //OK
    如果acc不是CheckAccount的对象,那么运行时就将抛出System.InvalidCastException

    多态性(1)
    面向对象程序设计中的重要概念多态性。
    在运行时,可以通过指向基类的引用,来调用实现派生类中的方法。
    同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就

    是多态性。
    多态性通过派生类覆写基类中的虚函数方法来实现。

    多态性(2)
    编译时的多态性
    编译时的多态性是通过重载来实现的。对于非虚的成员来说,系统在编译时,

    根据传递的参数、返回的类型等信息决定实现何种操作。
    运行时的多态性
    运行时的多态性就是指直到系统运行时,才根据实际情况决定实现何种操作。
    C#中,运行时的多态性通过覆写虚成员实现。

    重载(Overload)
    重载—类中定义的方法可能有不同的版本
    public bool Withdraw(double amt, string name)
    public double Withdraw(double amt) 
    特点(两必须一可以)
    方法名必须相同
    参数列表必须不相同
    返回值类型可以不相同

    虚拟函数
    声明虚方法
    使用virtual关键字 public virtual bool Withdraw(…);
    调用虚方法,运行时将确定调用对象是什么类的实例,并调用适当的覆写的方

    法。
    虚方法可以有实现体

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

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

    抽象方法
    抽象方法是必须被派生类覆写的方法。
    抽象方法是可以看成是没有实现体的虚方法
    如果类中包含抽象方法,那么类就必须定义为抽象类,不论是否还包含其它一

    般方法
    publc abstract bool Withdraw(…);

    何时使用继承?
    代码重用,减少编写的代码量
    设计重用
    公用的字段和方法可以放到父类中,然后由其派生新的子类,子类有自己的字

    段和方法。
    经验而言——”is a”的关系:
    如果A类是从B类中继承而来,即A是B的子类,那么我们可以说:“class A

    is-a class B”

    接口(1)
    接口为类提供了蓝图
    接口只提供定义
    实现接口的数据类型必须提供接口成员的实现
    接口本身可以从多个基接口派生

    public interface IAccount
    {
     void Method1();
     string Method2(int x,int y);
    }

    public class InsuranceAccount:IAccount
    {
     void Method1(){......}
     string Method2(int x,int y){......}

    }

  • 相关阅读:
    【剑指offer】07重建二叉树,C++实现
    【剑指offer】06从尾到头打印链表,C++实现
    面向对象设计模式原则01 开闭原则(OCP)
    面向对象设计模式原则02 里氏替换原则(LSP)
    面向对象设计模式原则03 依赖倒置原则(DIP)
    面向对象设计模式原则05 接口隔离原则(ISP)
    面向对象设计模式原则04 单一职责原则(SRP)
    leetcode1218
    leetcode1232
    leetcode1228
  • 原文地址:https://www.cnblogs.com/iceberg2008/p/1398908.html
Copyright © 2011-2022 走看看