1. new和override区别
override在子类中重写基类的方法;new在子类中为基类同名(virtual)方法添加一个新的版本,会保留基类的同名(virtual)方法。 下面的例子详细的展示它们的区别: public class BaseClass
{ public BaseClass() { } public virtual void Test() { Console.WriteLine("Test() in BaseClass"); } } public class DerivedClass1 : BaseClass { public override void Test() { Console.WriteLine("Test() in DerivedClass1"); base.Test(); } } public class DerivedClass2 : BaseClass { public new void Test() { Console.WriteLine("Test() in DerivedClass2"); base.Test(); } } class Program
输出如下,可以看到使用new时,如果将实例转换为基类类型,调用的方法为基类的方法:{ static void Main(string[] args) { DerivedClass1 class1 = new DerivedClass1(); class1.Test(); Console.WriteLine("-----------------------"); DerivedClass2 class2 = new DerivedClass2(); class2.Test(); Console.WriteLine("-----------------------"); BaseClass baseclass; baseclass = class1 as BaseClass; baseclass.Test(); Console.WriteLine("-----------------------"); baseclass = class2 as BaseClass; baseclass.Test(); Console.WriteLine("-----------------------"); Console.ReadLine(); } } Test() in DerivedClass1 Test() in BaseClass ----------------------- Test() in DerivedClass2 Test() in BaseClass ----------------------- Test() in DerivedClass1 Test() in BaseClass ----------------------- Test() in BaseClass ----------------------- 如果基类的同名方法不给出new和override修饰符,.Net默认采用new的方式,编译时将产生一条警告信息。 2. 关于static的构造函数 static的构造函数将在第一次使用该类的地方被调用。例如第一次调用该类的静态方法、属性,或者第一次实例化该类的一个对象等。 3. abstract, virtual abstract的类不能实例化,只能用于子类继承。 abstract的方法隐式的就是一个virtual方法;abstract的方法子类必须实现;abstract方法只能有声明,不能包含实现。 virtual方法提供给子类重写;可以包含实现。 4. as和强制类型转换 强制类型转换:MyClass myclass=(MyClass)obj; 使用as:MyClass myclass=obj as MyClass; 区别在于,如果obj不能被转换成MyClass类型,强制类型转换会抛出异常,而使用as时不会有异常,只是转换结果(myclass变量)的值为null。 |
|