(变量私有的叫字段,公有的是属性)
对象是一个自包含的实体,用一组可识别的特性和行为来识别
类:具有相同的属性和功能的对象的抽象的集合
(类名字首字母要大写,如果是多个单词则各个单词首字母都要大写)
构造方法/构造函数,就是对类进行初始化。构造方法与类同名,无返回值,
也不需要void,在new时候调用
(所有类都有构造方法,如果不编码则系统默认生成空的构造方法,
若你有定义的构造方法,那么默认的构造方法就会失效了)
方法重载提供了创建同民的多个方法的能力,但是这些方法需使用不同的参数类型。
(方法名相同,但参数类型或个数有所不同)
protected 表示继承时,子类可以对基类有完全访问权。子类继承父类,则子类就拥有了父类的
protected 只给继承的子类使用。
不继承的话,如果要修改功能,就必须在所有重复的方法中修改,代码越多,出错的可能就越大
继承是有缺点的,父类变,则子类不得不变。继承会增大两个类之间的耦合性。
(is-a 一个类是另一个类的特殊种类时,可以考虑用继承;has-a 某个角色具有某一项责任时,
1.子类以父类的身份出现。2.子类工作时以自己的方式来实现。3.子类以父类的身份出现时,子
为了使子类的实例完全接替来自父类的类成员,父类必须将该成员声明为虚拟的。只是通过在
不同的对象可以执行相同的动作,但要通过它们自己的实现代码来执行。
多态的原理是当方法被调用时,无论对象是否被转换为其父类,都只有位于对象继承链最末端
多态: 父类中virtual定义方法体 ,子类中通过override来具体实现
(不同的子类,实现的方式可以不同)
A9.重构 类名和构造函数名都继承父类(其中构造函数继承的方式是 方法名:base(),然后子类
抽象方法没有方法体,直接在括号后加分号;
1)抽象类不能实例化 2)抽象方法是必须被子类重写的方法 3)如果类中包含抽象方法,那么类就
抽象类的抽象成员可被子类部分实现,接口的成员需要实现类完全实现,一个类只能继承一个抽
第一,类是对对象的抽象,抽象类是对类的抽象,接口是对行为的抽象;
第二,如果行为跨越不同类的对象,可使用接口;对于一些类似的类对象,用继承抽象类;
第三,从设计角度讲,抽象类是从子类中发现了公共的东西,泛化出父类,然后子类继承父类,
(抽象类是自底而上抽象出来的,而接口是自顶向下设计出来的)
(ArrayList是System.Collections下的一部分,使用大小可按需动态增加的数组实现IList接口)
arrayAnimal=new List<Animal>();
arrayAnimal.Add(new Cat("小花"));...
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 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;}
}
{
MachineCat mcat=new MachineCat("叮当");
StoneMonkey wukong=new StoneMonkey("孙悟空");
array[0]=mcat;
array[1]=wukong;
MessageBox.Show(array[0].ChangeThing("各种各样的东西!"));
MessageBox.Show(array[1].ChangeThing("各种各样的东西!"));
}
设计模式380 委托和事件
护眼色度值:
色调85
饱和度90
亮度205