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


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

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

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

  • 相关阅读:
    JS中的prototype
    mustache.js渲染带事件的模板
    PHP的UTF-8中文转拼音处理类(性能已优化至极致)
    js
    git的作用和原理(待续)
    linux简单配置
    sql查询字段值长度判断是否18位
    sql查询重复值
    java获取某一字段日期并增加7天存入另一字段
    数据库20190206////2019-02-06 00:00:00.000日期格式页面转换
  • 原文地址:https://www.cnblogs.com/yinyakun/p/3233206.html
Copyright © 2020-2023  润新知