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();
}
}
}