20131118-静态类抽象类-外部设备

[1]访问级别约束

1.子类的访问级别不能比父类的高。(会暴露父类的成员)(未成年人不能去的地方,成年人都可以去)

2.类中属性或字段的访问级别不能比所对应的类型访问级别高。

3.方法的访问级别不能比方法的参数和返回值的访问级别高。

[*]用于解决"可访问性不一致"的错误。

//第一种情况,子类的可访问级别比父类的高

////第二种情况,类的访问修饰符和类方法的访问修饰符都高于【参数】的访问修饰符

////第三种情况,类的访问修饰符和类属性或字段的访问修饰符都高于【参数】的访问修饰符

////第四种情况,类的访问修饰符和类方法的访问修饰符都高于【参数】的访问修饰符

=================================================================

访问级别约束:子类访问级别不能比父类高(等级观念),因为子类能够出席的场合父类都应该能出席,如果父类可访问级别比子类低就有了父类去不了的场合(儿子能去的地方爹一定要能去)。举例;方法、属性等暴露的返回值、参数的数据类型不能比方法、属性或者所在类的可访问级别低,因为这些方法、属性要能在高级场合出现,如果用到的类型却不能在这个场合出现就明显不合理了。

=======================================================================

[2]虚方法

关于虚方法需要注意的几点:

1.父类中如果有方法需要让子类重写,则可以将该方法标记为virtual

2.虚方法在父类中必须有实现,哪怕是空实现。

3.虚方法子类可以重写(override),也可以不重写。

[*]

虚方法和抽象方法的区别

虚方法必须有实现,抽象方法必须没有实现

抽象方法必须在抽象类中声明,虚方法可以出现在抽象类中

抽象方法必须在子类中重写,虚方法可以被重写

[3]静态成员

[3.1]静态构造函数

//静态构造函数必须用static关键字标记

//静态构造函数不能有访问修饰符

//静态构造函数不能有参数。

//静态构造函数只会被调用一次。在第一次使用静态类前。

//静态类不能被实例化,就不会有对象,而this表示的是当前对象。所以在静态类不能使用this.

静态函数中不能用this

[3.2]

//静态成员、静态类在程序中的任何一个地方都可以访问;静态成员只访问静态成员;静态类中只有静态成员(主动的单一性与被动的包容性)

//不会因为超出了方法的作用域而不能访问。

//所以静态成员、静态类只有在程序退出的时候才会释放资源。

[*]静态类的继承问题staticàreflectoràsealed(不能被继承) +abstract(不能实例化)t

[*]静态和非静态的区别(加深对上面的理解)

问:非静态类中,能不能出现静态成员?

答:在非静态类中,可以出现静态的成员。

 

静态方法中只能够访问到静态的成员,而不-能访问到非静态的成员。

在非静态的方法中可以访问到静态的成员。

 

问:在静态类中,能不能够出现非静态成员?

答:在静态类中不能出现非静态成员。只能有静态成员。

静态成员和非静态成员调用上的区别:

非静态成员在调用的时候,使用对象.非静态成员();的方式进行调用

而静态成员在调用的时候,使用类名.静态成员();的方法进行调用

注意:静态类是不允许被实例化的。

 

什么时候使用静态类,什么时候使用非静态类。

1、我们一般把静态类作为一个工具类来使用。Console

2、静态类的资源在全局中是共享的。

3、静态类只有在程序结束的时候才释放资源。

[4]

抽象类

//1.需要用abstract关键字标记

//2.抽象方法不能有任何方法实现。

//3.抽象成员必须包含在抽象类中。

//4.由于抽象成员没有任何实现,所以子类必须将抽象成员重写。

//5.抽象类不能实例化,

//抽象类的作用:抽象类的作用就是为了让子类继承。

//6.抽象类中可以包括抽象成员,可以包括有具体代码的成员。

//7. 还有抽象方法不能用static修饰

[5]

new关键字(三种用途MSDN有详细介绍):

1.表示在子类中隐藏了从父类继承过来的那个虚方法。子类类型 obj=new 子类类型();

2.用new标记的方法是子类中的一个全新的方法,与从父类中继承过来的方法没有一点关系(截断了)

3.不能多态了。

[*]class Chinese : Person

{

//new关键字将父类中继承过来的SayHello()隐藏了。

//而下面的这个SayHello()与父类中的SayHello()没有任何半毛钱关系。

//这个不叫方法重写。

//当前类中没有重写父类中的SayHello()方法。

public new void SayHello()

{

Console.WriteLine("子类中的SayHello.");

}

}

[6]外部设备案例

namespace 外部设备2

{

class Program

{

static void Main(string[] args)

{

Computer cmp = new Computer();

MP3 mp3 = new MP3();

cmp.MobileDisk = mp3;

cmp.Read();

Upan upan = new Upan();

cmp.MobileDisk = upan;

cmp.Write();

Console.ReadKey();

}

}

public abstract class MobileDisk

{

public abstract void Read();

public abstract void Write();

}

public class MP3 : MobileDisk

{

public override void Read()

{

Console.WriteLine("mp3读取数据");

}

 

public override void Write()

{

Console.WriteLine("mp3写入数据");

}

}

public class Upan : MobileDisk

{

public override void Read()

{

Console.WriteLine("U盘读取数据");

}

 

public override void Write()

{

Console.WriteLine("U盘写入数据");

}

}

public class Computer

{

private MobileDisk _mobileDisk;

 

public MobileDisk MobileDisk

{

get { return _mobileDisk; }

set { _mobileDisk = value; }

}

public void Read()

{

this.MobileDisk.Read();

}

public void Write()

{

this.MobileDisk.Write();

}

}

}

20131118-静态类抽象类-外部设备

上一篇:MySQL 高频面试题目(3)


下一篇:【18】让接口容易被正确使用,不易被误用