• [最近学习]面向对象读书笔记


    静态类和非静态类:
    静态类(静态属性等)是类所有的,非静态类为类的实例所有的。
    静态类是类的所有实例所共享的,无论此类创建了多少实例,静态类在内存中都只开辟了一块存储空间。

    Const常量也可以看成这种类型:
    public class myClass{
     public const string KISS_MY_CLASS = "Oh, please kiss the class."; 
    }
    调用时可以直接myClass.KISS_MY_CLASS

    类的声明类型:
    protected: 可以在派生的子类中访问的
    internal:只有其所在类才可以访问(?)
    abstract:不允许直接被实例化的类
    sealed:不允许被继承的类

    方法的声明类型:
    virtual:抽象类里必须的虚拟方法,以此来表明此类为一个抽象类
    sealed:不允许被继承的方法
    override:多态的一种,覆盖,可以在直接使用父类的该方法base.xxx(e)的前提下,扩展自己的方法.
    abstract:简单的定义一个类型,需要派生类具体来实现的抽象方法
    extern:简单的定义一个类型

    方法的参数类型:
    值参:以此方法传递参数的,会copy一份相同值传入方法内部
    引用参:ref int param1 直接将传递参数的实际值的地址传入方法,而不会开辟新的存储空间。param1需要被初始化
    输出参:out int param2 与ref不同的是,param2不需要被初始化,其它与ref相同
    数组参:params int param3[] 数组参必须位于参数列表的最后,内存中为参数的最未开辟了一个可变化的数组存储空间,此类参数不允许再带有ref,out

    重载:方法名相同,返回类型相同,而参数不同(个数或类型)的多个方法

    操作符重载:
    操作符重载的需求起于对不同类型的相加的功能扩展,给操作符定义以新的含义,在特定的类上做新的栓释,比如传入字符串,则进行字符串的相加,这和常规的仅限于整型的+是不同的,当然此类需求也可以扩展到业务类的相加。
    可被重载的操作符为:
    + - * % / ++ --
    true false
    << >> == != > < >= <=
    ! & | ^ ~ 

    重载的方法(比如洛奇升一级的加点,Player为洛奇的玩家对象,我们用重载++来实现升级的新含义)
    public static Player operator ++ (Player _p){
     _p.strength += ;
     _p.AP += 3;
     _p.ability += 1;
     return _p;
    }
    再比如笛卡尔加法:
    public static DKR operator + (DKR d1, DKR d2){
     DKR _dkr = new DKR();
     _dkr.x = d1.x + d2.x;
     _dkr.y = d1.y + d2.y;
     _dkr.z = d1.z + d2.z;
     return _dkr; 
    }
    实现了这种类的相加:) 很好用吧。可以大大扩展我们的常规思维方法。

    readonly:只读域只能够在构造函数中进行修改
    public static readonly string KISS_MY_CLASS = "Oh, please kiss the class."; 
    public const string KISS_MY_CLASS = "Oh, please kiss the class."; 
    以上两句可以起到相同的效果
    不同的是,const的表达式的值是在编译时生成,而static readonly是在程序运行了之后才会被加载在内存中的。
    所以在另一个项目引用此dll时,如果KISS_MY_CLASS修改后,必须重新编译此dll,才能得到新的常量,而如果为static readonly,则不用编译即可以得到修改过的常量值。

    事件:Event
    我们需要在Button的重载中定义一个事件的类OnDoubleClick()
    1. 首先需要声明一个EventHandler的委托类(和abstract类似,只需要声明,不需要实现)
    public delegate void EventHandler(object sender,EventArgs e);//定义一个委托的类型,Event为EventHandler
    public class Button: Control{
     public event EventHandler DoubleClick; //定义一个事件OnDoubleClick
     protected void OnDoubleClick(EventArgs e){ //用来触发DoubleClick事件
      if (DoubleClick != null){
       DoubleClick(this.e);
      }
     }
    }

    索引器:
    string _name = string[8];
    public string this[int index]{
     get{
      return _name[index];
     }
     set{
      _name[index] = value;
     }
    }

    继承:C#中的继承规则.
    1. 继承可传递
    2. 派生类应当是对基类的扩展
    3. 构造函数与析构函数不能被继承
    4. 派生类如果定义了基类的同名成员,则基类的这些成员不能再被访问
    5. 派生类可以重载基类的虚方法,虚属性和虚索引器,表现为多态


    多态性:polymorphism
    同一操作对应不同的对象,有不同的解释产生不同的结果。多态性可以通过重载基类中的虚函数型方法来实现。
    重载虚方法,须使用override声明类型,而不能有static,virtual,new的修饰符

    抽象类:
    抽象类为它的派生类提供了一个公共的"界面",
    抽象类的派生类若要实现它父类的方法,则必须使用override来进行覆盖重载,抽象类与接口不同的是它还可以使用非抽象方法,即派生类override它的时候能使用base.xxx();来加入原型的成员,但如果是抽象方法则不能使用base来进行访问。
    抽象方法为抽象类中可以被其派生类重载的“界面”
    如果在派生类中使用 public abstract override void func();

    虚方法和抽象方法的区别:
    抽象方法是没有实际方法的界面函数,即只给子类提供了方法定义,需要子类进行实现,而虚方法可以有自己的实现;
    实现虚方法时,直接public override void func(),且里面可以用base.xxx()来加载原虚方法的内容,抽象类则不能。
    抽象类一定要有一个虚方法,而不需要有抽象方法.

  • 相关阅读:
    python3 装饰器
    Python3 迭代器与生成器
    Python3 循环
    Python3 条件控制
    Python3 字典
    Python3 元组
    Python3 列表
    08.HttpUrlconnection方式调用
    南海区行政审批管理系统接口规范v0.3(规划)
    day63-webservice 11.cxf整合spring
  • 原文地址:https://www.cnblogs.com/syveen/p/239711.html
Copyright © 2020-2023  润新知