zoukankan      html  css  js  c++  java
  • [最近学习]面向对象读书笔记

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

    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()来加载原虚方法的内容,抽象类则不能。
    抽象类一定要有一个虚方法,而不需要有抽象方法.

  • 相关阅读:
    java的构造方法 java程序员
    No result defined for action cxd.action.QueryAction and result success java程序员
    大学毕业后拉开差距的真正原因 java程序员
    hibernate的回滚 java程序员
    验证码 getOutputStream() has already been called for this response异常的原因和解决方法 java程序员
    浅谈ssh(struts,spring,hibernate三大框架)整合的意义及其精髓 java程序员
    你平静的生活或许会在某个不可预见的时刻被彻底打碎 java程序员
    Spring配置文件中使用ref local与ref bean的区别. 在ApplicationResources.properties文件中,使用<ref bean>与<ref local>方法如下 java程序员
    poj1416Shredding Company
    poj1905Expanding Rods
  • 原文地址:https://www.cnblogs.com/syveen/p/239711.html
Copyright © 2011-2022 走看看