弹指一挥间

好好做事,学习待人 (大数据分析/.NET/JAVA)技术交流QQ:860280456; .NET/JAVA技术交流群:192028174

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

(变量私有的叫字段,公有的是属性)
 
对象是一个自包含的实体,用一组可识别的特性和行为来识别
类:具有相同的属性和功能的对象的抽象的集合
(类名字首字母要大写,如果是多个单词则各个单词首字母都要大写)
构造方法/构造函数,就是对类进行初始化。构造方法与类同名,无返回值,
                   也不需要void,在new时候调用
   (所有类都有构造方法,如果不编码则系统默认生成空的构造方法,
    若你有定义的构造方法,那么默认的构造方法就会失效了)
方法重载提供了创建同民的多个方法的能力,但是这些方法需使用不同的参数类型。
    (方法名相同,但参数类型或个数有所不同)
protected 表示继承时,子类可以对基类有完全访问权。子类继承父类,则子类就拥有了父类的

除private外的属性和功能。(对子类公开,但不对其他类公开)
protected 只给继承的子类使用。
调用父类的成员,可以用base关键字
A7.继承的优点是,继承使得所有子类公共的部分都放在了父类,使得代码得到了共享,这样避
免了重复,另外,继承可使得修改或扩展继承而来的实现都较为容易
不继承的话,如果要修改功能,就必须在所有重复的方法中修改,代码越多,出错的可能就越大

继承是有缺点的,父类变,则子类不得不变。继承会增大两个类之间的耦合性。
(is-a 一个类是另一个类的特殊种类时,可以考虑用继承;has-a 某个角色具有某一项责任时,
不适合用继承,如飞机场有飞机则飞机不能继承飞机场)
A8.多态表示不同的对象可以执行相同的动作,但要通过它们自己的实现代码来执行。
1.子类以父类的身份出现。2.子类工作时以自己的方式来实现。3.子类以父类的身份出现时,子
类特有的属性和方法不可以使用。
  为了使子类的实例完全接替来自父类的类成员,父类必须将该成员声明为虚拟的。只是通过在
该成员的返回类型之前添加virtual关键字来实现。子类可以选择使用override关键字,讲父类
实现替换为它自己的实现,这就是方法重写override,或方法覆写。
  不同的对象可以执行相同的动作,但要通过它们自己的实现代码来执行。
  多态的原理是当方法被调用时,无论对象是否被转换为其父类,都只有位于对象继承链最末端
的方法实现会被调用。虚方法是按照其运行时类型而非编译时类型进行动态绑定调用的。
多态: 父类中virtual定义方法体 ,子类中通过override来具体实现
                                 (不同的子类,实现的方式可以不同)
A9.重构 类名和构造函数名都继承父类(其中构造函数继承的方式是 方法名:base(),然后子类
中重写实现的方法) 这样调用的方法相同,但是实现的效果可以达到不同
A10.抽象类 把实例化没有任何意义的父类(如Animal)改成抽象类。允许把类和方法声明为
abstract,即抽象类和抽象方法。
抽象方法没有方法体,直接在括号后加分号;
1)抽象类不能实例化 2)抽象方法是必须被子类重写的方法 3)如果类中包含抽象方法,那么类就
必须定义为抽象类,不论是否还包含其中一般方法
A11.接口 接口把隐式公共方法和属性组合起来,以封装特定功能的一个集合。一旦实现了接口
,类就可以支持接口所指定的所有属性和成员。声明接口在语法上和声明抽象类完全相同,但不
允许提供接口中任何成员的执行方法。(接口不能实例化,不能有构造方法和字段,不能有修饰
符如public、private等;不能声明虚拟的或者静态的等)。实现接口的类就必须要实现接口中的
所有方法和属性。
抽象类的抽象成员可被子类部分实现,接口的成员需要实现类完全实现,一个类只能继承一个抽
象类,但可以实现多个接口等等。
第一,类是对对象的抽象,抽象类是对类的抽象,接口是对行为的抽象;
第二,如果行为跨越不同类的对象,可使用接口;对于一些类似的类对象,用继承抽象类;
第三,从设计角度讲,抽象类是从子类中发现了公共的东西,泛化出父类,然后子类继承父类,
而接口是根本不知道子类的存在,方法如何实现还不确定,预先定义。
(抽象类是自底而上抽象出来的,而接口是自顶向下设计出来的)
A12.集合 数组的容量是固定的,而ArrayList的容量是可根据需要自动扩充的。
(ArrayList是System.Collections下的一部分,使用大小可按需动态增加的数组实现IList接口)
A13.泛型 声明一泛型变量,如:IList<Animal> arrayAnimal; (IList或List均可)
       arrayAnimal=new List<Animal>();
       arrayAnimal.Add(new Cat("小花"));...
 
 
A7.继承
class Animal
{
    protected string name="";
    public Animal(string name)
    {this.name=name;}
    public Animal()
    {this.name="无名";}
 
    protected int shoutNum=3;
    public int ShoutNum
    {
       get {return shoutNum;}
       set {shoutNum=value; }
    }
}
class Cat : Animal
{
    public Cat () :base ()
    {}
    public Cat(string name)
    {}
    public string Shout()
    {
       string result="";
       for(int i=0;i<shoutNum;i++)
        {result += "喵, ";}
  
        return "我的名字叫"+ name + ""+ result;
     }
}
class Dog : Animal
{
     public Dog () :base ()
     {}
     public Dog(string name)
     {}
    public string Shout()
    {
      string result="";
      for(int i=0;i<shoutNum;i++)
      {result += "汪, ";}
  
     return "我的名字叫"+ name + ""+ result;
    }
}

A8.多态
class Animal
{
    public virtual string Shout() //虚方法,可以被子类重写
    {  return "";  }
}
class Cat : Animal
{
      public Cat():base()
      {}
      public Cat(string name):base(name)
      {}
      public override string Shout()
      {
         string result="";
         for(int i=0;i<shoutNum;i++)
         {
           result+="喵, ";
         }
         return "我的名字叫"+ name + " "+result;
      }
}
class Dog : Animal
{
    public Dog():base()
    {}
    public Dog(string name):base(name)
    {}
    public override string Shout()
    {
        string result="";
        for(int i=0;i<shoutNum;i++)
        {
          result+="汪, ";
        }
       return "我的名字叫"+ name + " "+result;
    }
}
private Animal[] arrayAnimal;
private void button1_Click(object sender,EventArgs e)
{
     arrayAnimal=new Animal[5];
     arrayAnimal[0]=new Cat("小花");
     arrayAnimal[1]=new Dog("阿毛");
     arrayAnimal[2]=new Dog("小黑");
     arrayAnimal[3]=new Cat("娇娇");
     arrayAnimal[4]=new Cat("咪咪");
}
private void button2_Click(object sender,EventArgs e)
{
     //由于多态性,所以叫的时候,会不同;程序会自动去找item是什么对象,如Cat,Dog
     foreach(Animal item in arrayAnimal)
     { MessageBox.Show(item.Shout()); }
}

A10.抽象类
abstract class Animal
{
     protected abstract string getShoutSound();//没有方法体,直接加分号
}
//只要类中有抽象方法,则该类一定是抽象类;
//继承抽象类一定要实现抽象类的方法(即重写)

A11.接口
interface IChange
{
     string ChangeThing(string thing);  //表示返回sting型
}

class MachineCat:Cat,IChange //继承 Cat,并实现IChange接口
{
    public MachineCat():base()
    {}
    public MachineCat(string name):base(name)
    {}
    public string ChangeThing(string thing)//实现接口的方法
    {return base.Shout()+"我有万能口袋,我可变出:"+thing;}
}

private void button1_Click(object sender,EventArgs e)
{
     MachineCat mcat=new MachineCat("叮当");
     StoneMonkey wukong=new StoneMonkey("孙悟空");
     IChange [] array=new IChange[2];
     array[0]=mcat;
     array[1]=wukong;
     //利用多态性实现不同的ChangeThing
     MessageBox.Show(array[0].ChangeThing("各种各样的东西!"));
     MessageBox.Show(array[1].ChangeThing("各种各样的东西!"));
}
 

设计模式380 委托和事件

护眼色度值:
色调85
饱和度90
亮度205
posted on 2013-02-19 22:54  v.e.n.u.s  阅读(321)  评论(0编辑  收藏  举报