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

  • 该参数以 this 修饰符为前缀
  • C#扩展方法第一个参数指定该方法作用于哪个类型
  • 必须是静态类才可以添加拓展方法,静态类中要定义静态方法

1.首先我们要准备一个 普通类

    public class Student
    
        public string StuInfo() …… 
        public  string getStuInfo(string stuName, string stuNum) ……
     

2.准备一个静态类 通过静态类 来编写拓展方法

3.通过对象调用拓展方法


抽象abstract

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

接口 interface

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

二、修饰符

ref 修饰符 按引用传值

能够使值类型按照引用类型来进行传参


out 修饰符 按照引用类型返回多个结果

  • ref 主要用来传参,out主要用来获取结果
  • return返回一个结果,out可以返回多个结果


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;

三、重载操作符

装箱和拆箱

什么是装箱

把值类型(int i = 3)赋值给 引用类型 ( object)
有时候需要把值类型转换为引用类型做统一管理

什么是拆箱

拆箱就是装箱的逆操作,是显式转换,就是强制转换


重载运算符

哪些运算符可以重载


四、泛型

什么是泛型

  • 什么是泛型类?泛型类就是一个模具,是类的类型
  • T 相当于一个占位符
  • Dog 就是原本的T,是一个模板

泛型方法和泛型接口

# 泛型方法
public void IsHappy<T>T targer)

# 泛型接口
interface IMyself<T> T Myself(T self) 

# 泛型接口实现
class PeopleIMySelf<Sing>
	……


泛型约束 where

只有满足约束的条件,才可以使用泛型

# 使用where 进行约束
public void IsHappy<T>T target)where T:Pet
# 调用方法的时候要满足
dog.IsHappy<Pet>()


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

C#002 方法和接口

Java复习攻略04

Java面向抽象,接口编程实验

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

步步为营-04-一个通过接口实现多态的经典例子

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