zoukankan      html  css  js  c++  java
  • 密封类和密封方法,抽象类和抽象方法,虚函数,接口

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

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

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

  • 相关阅读:
    android 中文 api (43) —— Chronometer
    SVN客户端清除密码
    Android 中文 API (35) —— ImageSwitcher
    Android 中文API (46) —— SimpleAdapter
    Android 中文 API (28) —— CheckedTextView
    Android 中文 API (36) —— Toast
    Android 中文 API (29) —— CompoundButton
    android 中文 API (41) —— RatingBar.OnRatingBarChangeListener
    Android 中文 API (30) —— CompoundButton.OnCheckedChangeListener
    Android 中文 API (24) —— MultiAutoCompleteTextView.CommaTokenizer
  • 原文地址:https://www.cnblogs.com/yinyakun/p/3233206.html
Copyright © 2011-2022 走看看