C#002 方法和接口

Posted RyouJou

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#002 方法和接口相关的知识,希望对你有一定的参考价值。


一、方法和接口

重载 override

C#中允许方法名重复(方法重载),要求方法参数要么个数不同,要么类型不同

        //三个方法名字都叫Learn 方法1、2参数个数相同但是类型不同 方法1、3参数类型相同但是个数不同
        public void Learn(string subject, int time)
        {
            Console.WriteLine("学习{0}科目, 学习时长:{1}", subject, time);
        }
        public void Learn(string subject1, string subject2)
        {
            Console.WriteLine("学习{0}科目, 学习{1}科目", subject1, subject2);
        }
        public void Learn(string subject, int time, float ratio)
        {
            Console.WriteLine("学习{0}科目, 学习时长:{1}, 学习效率:{2}", subject, time, ratio);
        }


重构 override


虚方法 virtual

virtual虚方法

  • 加关键字 virtual 这样就将该方法标记为虚方法 virtual public void Speak(){}
  • 这个方法其实就是为了重写方法而存在的 public override void Speak(){}
  • 基类虚方法可以在派生类用override重写
  • 【什么时候使用】实现这个功能(输出)要写在父类中,在不同的子类中需要重写
  • 【作用】动物会叫,默认有一个叫声,但是猫狗叫声不一,重写实现多态
  • 不能是private和static

基类引用和派生类引用

Pet基类、Dog派生类
# pet.Speak() 基类引用 如果派生类没有override,直接使用虚方法
# pet.Speak() 基类引用 如果派生类有override,直接使用重写方法
# dog.Speak() 派生类引用 直接使用重写的方法

拓展方法 Extension Methods

  • C#3.0时引入的新特性
  • 最常见是在LINQ中使用
  • 该参数以 this 修饰符为前缀
  • C#扩展方法第一个参数指定该方法作用于哪个类型
  • 必须是静态类才可以添加拓展方法
  • 静态类中要定义静态方法

首先我们声明一个Student类,它包含了两个方法StuInfo,getStuInfo.

    public class Student
    {
        public string StuInfo()
        {
            return "学生基本信息";
        }
        public  string getStuInfo(string stuName, string stuNum)
        {
       return string.Format("学生信息:\\n" + "姓名:{0} \\n" + "学号:{1}", stuName, stuNum);
        }
     }

声明一个名为ExtensionStudentInfo的静态类,注意必须为静态。这个类的作用就是包含一些我们想要扩展的方法

    public static class ExtensionStudentInfo
    {
        //声明扩展方法
        //要扩展的方法必须是静态的方法,Add有三个参数
        //this 必须有,string表示我要扩展的类型,stringName表示对象名
        //三个参数this和扩展的类型必不可少,对象名可以自己随意取如果需要传递参数,再增加一个变量即可
        public static string ExtensionStuInfo(this Student stuName)
        {
            return stuName.StuInfo();
        }
        //声明扩展方法
        //要扩展的方法必须是静态的方法,Add有三个参数
        //this 必须有,string表示我要扩展的类型,stringName表示对象名
        //三个参数this和扩展的类型必不可少,对象名可以自己随意取如果需要传递参数,在此我们增加了两个string类型的参数
        public static string ExtensionGetStuInfo(this Student student, string stuname, string stunum)
        {
            return student.getStuInfo(stuname, stunum)+"\\n读取完毕";
        }
    }

以上的工作做完之后便可以使用我们的扩展方法了,注意必须要用对象来调用扩展方法

        static void Main(string[] args)
        {
            Student newstudent = new Student();
//要使用对象调用我们的扩展方法
            string stuinfo = newstudent.ExtensionStuInfo();
            Console.WriteLine(stuinfo);
//要使用对象调用我们的扩展方法
string stuinformation = newstudent.ExtensionGetStuInfo("quzijing", "20081766");
            Console.WriteLine(stuinformation);
            Console.ReadKey();
        }

区别、什么时候需要用

什么时候用虚方法?

如果我们实现的这个功能它的一部分功能(输出)要写在父类中,而且在不同的子类中需要重写,那么在父类中的方法必须定义为虚方法,

什么时候用抽象方法?

如果在父类中只需要指定有什么功能,但不需要实现,这个时候我们就把父类中的方法定义为抽象方法。

抽象abstract

  • 抽象成员是指,被设计为覆写的函数成员
  • 必须用abstract修饰
  • 抽象类只能用做其他类的基类,设计为被继承的类
  • 抽象类不能创建实例

接口 interface

  • 一个类能同时实现多个接口
  • 接口中的成员不允许使用 public、private、protected、internal 访问修饰符
  • 接口中的成员不允许使用 static、virtual、abstract、sealed 修饰符

二、修饰符

readonly 修饰符

一旦被设定就不能改变,是动态常量

静态常量(compile-time constants)和动态常量(runtime constants)
比如一个学生的学号就很适合被写成只读字段

# 必须在声明const对其进行初始化
# 
# const已经默认是静态类型(即static类型)

using System;
class P
{
    const int A = B * 10;
    const int B = 10;
    public static void Main(string[] args)
    {
        Console.WriteLine("A is {0},B is {1} ", A, B);
    }
}

输出的结果是:A is 100,B is 10,不是A is 0,B is 10

# readonly修饰的常量是动态常量
# 动态常量的值则是在运行的那一刻才获得的
# readonly成员可以在运行时在构造函数中初始化,并且可以在声明它们时进行初始化

using System;
class P
{
    static readonly int A = B * 10;
    static readonly int B = 10;
    public static void Main(string[] args)
    {
        Console.WriteLine("A is {0},B is {1} ", A, B);
    }
}


输出的结果是:A is 0,B is 10,不是A is 100,B is 10
int变量的默认值就是0嘛,运行时是在乎字段定义的先后顺序的
当您拥有一个可以在运行时知道的类型的变量(字符串文字,int,double,enums ...)时,请使用const ,您希望类的所有实例或使用者都可以访问该值不应更改的位置。
当您拥有希望类的所有实例或使用者可以访问值可以更改的位置的数据时,请使用static 。
当您拥有一个在运行时(对象)不知道的类型的变量,而您希望某个类的所有实例或使用者都可以访问该值不应更改的位置时,请使用静态只读 。
当您有一个实例级别的变量,该变量在创建对象时会知道,该变量不应更改,请使用readonly 。

this 关键字

this关键字是对当前实例的引用

this.Var1;

以上是关于C#002 方法和接口的主要内容,如果未能解决你的问题,请参考以下文章

C#002 方法和接口

002 策略设计模式

HLS NGINX-RTMP [错误] 1281#0:* 58 hls:强制片段拆分:10.002 秒

002-多线程实现方式threadrunnablecallalethread和runnable对比

Unicode字符列表的代码显示与描述

002 为什么接口中可以同时使用public与default 修饰抽象方法?