有时候我们的类没有必要再被继承的必要,或者我们编写的类不想被继承,那么我们就要使用密封类了。
密封类在声明的时候,使用sealed修饰符,如果想继承一个密封类,那么c#会提示报错,所以,密封类不可能有派生类。
1 public sealed class sealed_test 2 { 3 public sealed_test() 4 { 5 Console.WriteLine("父类构造方法"); 6 } 7 private void sayhello() 8 { 9 Console.WriteLine("我是父类"); 10 } 11 } 12 public class child_class : sealed_test 13 { 14 public child_class() 15 { 16 Console.WriteLine("子类构造方法"); 17 } 18 private void sayhello() 19 { 20 Console.WriteLine("我是子类"); 21 } 22 }
这个时候会报错提示错误为:
抽象类和抽象方法:
抽象类是为继承而生,基类不具有任何执行代码,只是进行定义。c#通过abstract 来实现抽象类和抽象方法。抽象类不能实例化,抽象方法没有具体执行代码,必须在非派生类中
重写。
1 public abstract class abstrat_test 2 { 3 public abstrat_test() 4 { 5 Console.WriteLine("父类构造方法"); 6 } 7 public abstract void sayHello() 8 { 9 Console.WriteLine("hello"); 10 } 11 }
这样会报错错误为:
抽象类不能实例化所以第二个报错,第一错误为在sayHello()方法中有代码。
只有通过这样的方法:
1 public abstract class abstrat_test 2 { 3 public abstrat_test() 4 { 5 Console.WriteLine("父类构造方法"); 6 } 7 public abstract void sayHello(); 8 9 } 10 public class child_abstrat:abstrat_test 11 { 12 public child_abstrat() 13 { 14 Console.WriteLine("我是子类构造方法"); 15 } 16 public override void sayHello() 17 { 18 Console.WriteLine("hello ,我是子类"); 19 //throw new NotImplementedException(); 20 } 21 }
主函数中new一个子类c1然后c1.sayHello();运行结果为:
如果不想把类声明为抽象类,但又想实现方法在基类里不具体实现,而在派生类中重写实现功能,这时候就用到了虚函数
将上面的代码仅仅改为:public virtual void sayHello(){}就可以了。运行结果同上。
接口:c#中不允许多重继承,但是允许类派生于多个接口。如果有时候你必须继承多个类的特性,为了实现多重继承,可以使用接口。
实现例子代码:
1 namespace delegate_tesst 2 { 3 interface Iface1 4 { 5 void say(); 6 void sayHello(); 7 } 8 interface Iface2 9 { 10 void say(); 11 void sayBye(); 12 } 13 class interface_test:Iface1 ,Iface2 14 { 15 void Iface1.say() 16 { 17 Console.WriteLine("这是Iface1的say方法"); 18 } 19 public void sayHello() 20 { 21 Console.WriteLine("这是Iface1的sayHello方法"); 22 } 23 24 void Iface2.say() 25 { 26 Console.WriteLine("这是Iface2的say方法"); 27 } 28 public void sayBye() 29 { 30 Console.WriteLine("这是Iface2的sayBye方法"); 31 } 32 } 33 }
main方法中的代码:
1 interface_test f1 = new interface_test(); 2 ((Iface1)f1).say(); 3 ((Iface2)f1).say(); 4 5 f1.sayHello(); 6 f1.sayBye(); 7 Console.ReadKey();
运行结果为:
这里面需要注意的是:如果两个或多个接口中方法重名,那么在方法实现的时候不能加public等关键字。每个方法前面需要有相应的接口名,让计算机知道要实现那个方法。
对于不同名称的方法,前面必须加public等关键字。
在实现接口的类实例化的时候,必须要将该实例化后的对象强制转化为相应的接口类型。