一、类的继承
注意点:
①子类别在调用自身的构造方法之前,会先调用父类的构造方法
②子类重写父类的方法时
可以使用new关键字 或者override。
③ 装箱与拆箱
装箱: Animal cat = new cat();
拆箱: ( (Cat) cat ).Climb() //强制转型之前最好先判断 if ( dog is Dog ) { }
④sealed关键字(密封)
当一个类被sealed继承时,该类不可以被继承
同样的,当一个类的方法被seled修饰时,这个类的子类不能重写该方法。
⑤ virtual关键字(虚拟)
当一个方法使用 virtual 关键字修饰时,表明定义该方法时,就知道子类需要进行重写。
子类重写时需要用override
⑥base关键字(调用父类的字段和方法)
通过base关键字可以调用父类的字段和方法,
例如在 Dog 类中,对父类的Shout()方法进行重写,但是还想用父类Shout()
class Animal
{
public virtual void Shout()
{
//动物叫
}
}
class Dog: Animal
{
public overrid void Shout()
{
base.Shout();
}
}
base 调用父类的构造方法(P135)
class A
{
}
class B : A
{
public B () :base()
{
}
}
⑦ is 和 as 关键字
当判断对象是否为某个类时使用
is:
if ( animal is Dog ==false )
{
return false;
}
Dog dog = (Dog)(animal);
as:
Dog dog = animal as Dog;
if ( dog ==null )
{
return false; //错误先行
}
两种方法都可以,as的好处在于,判断的同时 如果是,就已经把 animal 转换成 dog了。
二、多态的实现、体现
体现为调用一个方法,可以出现不同的调用/方法
例如:
static void Main (string [] args)
{
Animal an1 = new Cat();
Animal an1 = new Dog();
animalShout (an1);
animalShout (an2);
}
//此处定义animalShout 方法,传进来的变量为父类Animal ,因此 an1 和 an2 都可以穿进来。
public static void animalShout (Animal an)
{
//此处可以根据传进来的是狗还是猫,来调用他们各自的叫方法
an.Shout();
}
三、一个窗体打开另一个窗体
当使用时候
myChildFrm = new ChildFrm();//创建子窗口对象
myChildFrm.Show();//显示子窗口
来调出新窗体时,若按新窗体的关闭按钮。
在show则会报错:无法访问已释放的对象。
解决方案:
①
if(myChildFrm.IsDisposed)
myChildFrm = new ChildFrm();//如果已经销毁,则重新创建子窗口对象
②(最好)
在Form2 的Dispose 方法内增加
Hide();
//后面注释掉。
//这样Form2永远没办法关掉了
③
this.FormClosing += new System.Windows.Forms.FormClosing;
//在方法内写
{
Hide();
e.Cancel = true;//后面流程不执行了,如果不加,还是会关闭。
}