zoukankan      html  css  js  c++  java
  • 一步一步学习C#(四 继承)

    1.类的继承

         1)继承父类,即拥有该类的所有成员字段和方法     比如:继承一个控件,就等于继承了此控件的所有方法与属性,节省编码量。

            1.启动vs,建立一个简单的winform窗口,输入一个按钮,在按钮事件中写入代码:MessageBox.Show("you clicked me!");

            2、我们再建立一个Form窗口,我们选择“继承的窗体”,再次选择刚刚建立的Form1。

            3、这样在新建立的Form2窗口中也有一个按钮了(这个按钮就是继承了Form1窗口而来,而且删除不掉)。

            4、我们修改入口方法main(),修改代码如下:      将原来的Application.Run(new Form1());修改为为Application.Run(new Form2());

            5、运行效果一样,但是实际上运行的是一个继承的窗体。

     (1)接口类似于一个模板,它定义了一种签名方式,什么是签名?  int onemethod(int a){}  就是定义了一种签名方式,它的内容是空的。 如果一个具有int参数并且有int返回值的方法,我们就说满足此种签名方式。 (2)一个类继承了接口,则必须要有接口中定义的签名的方式的方法。 (3)接口中定义的方法不能有实际内容。 (4)接口就是通过继承来使用的。 (5)接口不能包括字段。

     (1)       结构派生于System.ValueType,它们不能实现继承,但是可以继承接口。 (2)       类可以继承类和接口。

     如果签名相同的方法在基类和派生类中都进行了声明,但该方法没有声明为virtual 和 override,派生类方法就会隐藏基类方法。

     用base关键字表示基类 用this关键字表示本类     base.<MethodName>()  this. <MethodName>()

     (1)抽象类用abstract来定义  (2)抽象类与接口非常类似,抽象方法没有执行代码,  (3)抽象类不能实例化,只能继承  (4)抽象方法没有执行代码,必须在非抽象的派生类中重写  (5)类中成员只要有一个是抽象的,则类必须是抽象的。  (6)抽象方法用override重写,而接口则不用。

     (1)对于一些永远也不想让别人继承我们用sealed来修饰它。 (2)当然它的方法是不可重写的,也就是不可以定义为虚方法。 (3)不能将sealed作用于方法。

     (1)在子类中声明同样的方法 (2)在子类中声明同样的方法,并用new修饰 (3)在子类中声明同样的方法,用override来修饰,当然必须祖先要有virtual修饰。

     (1)声明接口在语法上与声明抽象类完全相同 (2)接口中只能包含方法、属性、索引器和事件的声明。 (3)不能实例化接口,接口不能有构造函数。 (4)接口成员总是公共的,不能声明为虚拟或静态。因为它是依附于类的。 (5)接口是可以继承的。例如:

      列子:

    1 Public class a
    2 {}
    3 Public class b:a
    4 {}

     

     

    2.接口的继承

     1)接口类似于一个模板,它定义了一种签名方式,什么是签名?

          int onemethod(int a){}  就是定义了一种签名方式,它的内容是空的。
         如果一个具有int参数并且有int返回值的方法,我们就说满足此种签名方式。
    2)一个类继承了接口,则必须要有接口中定义的签名的方式的方法。
    3)接口中定义的方法不能有实际内容。
    4)接口就是通过继承来使用的。
    5)接口不能包括字段。
    接口继承代码:
    1 public interface tank_action
    2 {
    3 void fire();
    4 void go();
    5 }
    6  class tank1:tank_action
    7 {
    8 public void fire()
    9 {
    10 Console.WriteLine("tank1 is now firing!");
    11 }
    12 public void go()
    13 {
    14 Console.WriteLine("tank1 is now going!");
    15 }
    16 }
    17
    18 调用:
    19 tank1 aa = new tank1();
    20 aa.fire();
    21 aa.go();
    22 Console.ReadLine();

    注意:

     

    1 一个类只能有唯一的一个父类,而不能同时继承多个
    2 例如:
    3 public class a
    4 {
    5 }
    6 public class b
    7 {
    8 }
    9 public class c : a,b
    10 {
    11 }
    12  

     
        结构与类在继承上的区别:
    (1结构派生于System.ValueType,它们不能实现继承,但是可以继承接口。
     
    2类可以继承类和接口。
      
    接口特性: 
    1声明接口在语法上与声明抽象类完全相同
    2接口中只能包含方法、属性、索引器和事件的声明。
    3不能实例化接口,接口不能有构造函数。
    4接口成员总是公共的,不能声明为虚拟或静态。因为它是依附于类的。
    5)接口是可以继承的。
      
    3.隐藏方法
        如果签名相同的方法在基类和派生类中都进行了声明,但该方法没有声明为virtual override,派生类方法就会隐藏基类方法。
    1 隐藏方法例子:
    2  class class1
    3 {
    4 public void class1_method1()
    5 {
    6 Console.WriteLine("aa");
    7 }
    8 }
    9 class class2:class1
    10 {
    11 public void class1_method1()
    12 {
    13 Console.WriteLine("bb");
    14 }
    15 }
    16 调用:
    17 class2 testclass =
    18  new class2();
    19 testclass.class1_method1();
    20 Console.ReadLine();

     

    4.调用函数的基类

      用base关键字表示基类
      用this关键字表示本类   
      base.<MethodName>()
      this. <MethodName>()
    代码
    调用基类例子:
    class CustomerAccount
    {
    public virtual decimal CalculatePrice()
    {
    return 1M;
    }
    }
    class GoldAccount : CustomerAccount
    {
    public override decimal CalculatePrice()
    {
    return base.CalculatePrice() * 0.9M;
    }
    }
    调用:
    GoldAccount test
    = new GoldAccount(); Console.WriteLine(test.CalculatePrice()); Console.ReadLine();

     
    5.抽象类和抽象方法
     1)抽象类用abstract来定义
     2)抽象类与接口非常类似,抽象方法没有执行代码,
     3)抽象类不能实例化,只能继承
     4)抽象方法没有执行代码,必须在非抽象的派生类中重写
     5)类中成员只要有一个是抽象的,则类必须是抽象的。
     6)抽象方法用override重写,而接口则不用。
    1 抽象类和抽象方法例子:
    2 abstract class Building
    3 {
    4 public abstract decimal Calculate(); // abstract method
    5   }
    6 class newBuilding : Building
    7 {
    8 public override decimal Calculate ()
    9 {
    10 Console.WriteLine("aa");
    11 return 2.2M;
    12 }
    13 }
    14
    15 调用:
    16 newBuilding test = new newBuilding();
    17 Console.WriteLine(test.Calculate ());
    18 Console.ReadLine();
    19
    20
    21  
    6.密封类和密封方法 
    1)对于一些永远也不想让别人继承我们用sealed来修饰它。
     
    2)当然它的方法是不可重写的,也就是不可以定义为虚方法。
     
    3)不能将sealed作用于方法。
    1 密封类和密封方法例子:
    2  sealed class FinalClass
    3 {
    4 //不能定义为虚方法,,因为本身这个类都是不需要继承的,那么定义为虚方法的意义就不大了
    5 //public virtual void cal()
    6 // {
    7 // Console.WriteLine("cc");
    8 // }
    9  
    10 public void cal()
    11 {
    12 Console.WriteLine("cc");
    13 }
    14 public static void StaCal()
    15 {
    16 Console.WriteLine("bb");
    17 }
    18 }
    19  //密封类是不能继承的
    20 //class DerivedClass : FinalClass
    21 //{
    22 //public override void cal()
    23 //{
    24 // Console.WriteLine("bb");
    25 //}
    26 //}
    27  
    28  

    在子类中覆盖父类方法:

    1)在子类中声明同样的方法
     
    2)在子类中声明同样的方法,并用new修饰
     
    3)在子类中声明同样的方法,用override来修饰,当然必须祖先要有virtual修饰。
    base 引用父类方法:
    1 public class aa
    2 {
    3 public void one()
    4 {
    5 Console.WriteLine("aa");
    6 }
    7 }
    8 public class bb : aa
    9 {
    10 new public void one()
    11 {
    12 base.one();
    13 Console.WriteLine("bb");
    14 }
    15 }
    16  

     

    7.类的修饰符

     

  • 相关阅读:
    穆僮电脑小课堂
    PMON
    mmcm 和pll
    手把手教你完成第一个vivado项目
    Vivado的helloword程序:软件工程部分
    Vivado的helloword程序:硬件工程部分
    让 Vivado有Zybo Board的配置文件
    vivado笔记
    Spartan6上软核系统自定义外设调用AXI Stream FFT经验
    网站目录下多出的 core 文件
  • 原文地址:https://www.cnblogs.com/MR_ke/p/1686236.html
Copyright © 2011-2022 走看看