C#培训2019-9-23第五课 类的继承(sealed is as base virtual )、FORM2无法访问已释放的对象

一、类的继承
注意点:
①子类别在调用自身的构造方法之前,会先调用父类的构造方法

②子类重写父类的方法时
可以使用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;//后面流程不执行了,如果不加,还是会关闭。
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值