密封类和密封方法,抽象类和抽象方法,虚函数,接口

有时候我们的类没有必要再被继承的必要,或者我们编写的类不想被继承,那么我们就要使用密封类了。

密封类在声明的时候,使用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等关键字。

在实现接口的类实例化的时候,必须要将该实例化后的对象强制转化为相应的接口类型。

 

 

posted @ 2013-08-02 17:54  lanacon  Views(338)  Comments(0Edit  收藏  举报