C#学习(方法和参数,类,继承,接口)

这一部分主要是:方法和参数,类,继承,接口。

方法和参数

  • 方法总是和类型(类)一一关联。

  • 方法通过实参接收数据,实参由方法的参数或形参定义。

  • using指令:

    • 导入命名空间
    • 为命名空间或者类型取一个别名(消除两个同名类型的歧义和缩写长名称)
  • 参数数组的注意事项:

    • 参数数组必须是方法声明中的最后一个参数,也最多出现一个参数数组。
    • 调用者可以指定和参数数组对应的零个实参,这会造成传递的参数数组包含零个数据项。
    • 参数数组是类型安全的——实参类型必须兼容于参数数组中元素的类型。
    • 调用者可以显示地使用数组,而不是以逗号分隔参数列表。
  • 递归:千万要注意设置结束条件,要不就进入死循环。

  • 方法重载:是一种操作性多态。

  • 可选参数

    • 要尽可能为所有参数提供好的默认值。
    • 要提供简单的方法重载,其必须的参数的数量要少
    • 考虑从最简单到最复杂来组织重载
  • 常见异常类型:

类 Class

1、抽象类

关键字: abstract

使用目的:若所有子类拥有共同的特性,可以把这个特性放到一个抽象类中,子类继承此抽象类。

特点:

1.不能被实例化;ClassName en=new ClassName();//这样会报错。

2.抽象成员必须包含在抽象类中。

3.抽象类除了抽象成员外,还可以包含别的成员(不用关键字 abstract)。

4.子类继承抽象父类后,必须把父类中的所有抽象成员都重写(非抽象成员不必重写)。除非子类也是个抽象类。

5.抽象成员的访问修饰符不能是private。

6.抽象类是有构造函数,虽然不能被实例化。

7.abstract不能用于字段成员,可定义成属性。

8.abstract用于方法时,方法不能定义主体(内容)。

9.抽象类也可以实现接口,但要把接口的成员前面标记个abstract。

2、密封类

关键字: sealed

使用目的:不需要子类来继承他。如 String;

特点:

1.不能被继承,如:string ,不能被继承。

2.子类重写后,前面加个sealed,那么子类就不能再被继承。

3、静态类

关键字: static

使用目的:不需要实例化,可以直接类名引用静态方法。比如 工具类。

特点:

1.相似于sealed与abstract使用。

2.静态成员在整个程序退出时才释放资源,所以尽量别写静态字段、属性。最好是静态方法。
  • 类是面向对象编程的三个主要特征(封装继承和多态性)的基础。
  • 关键字this:显示指出当前访问的字段或方法是包含类的实例成员。
  • 关键字const常量包含在编译时确定的值,它不可以在运行时改变。
  • readonly修饰符只能用于字段,不能用于局部变量,它指出字段值只能从构造器中更改,或者直接在声明时指定。

const和readonly的区别

  • const 字段只能在该字段的声明中初始化。
    readonly 字段可以在声明或构造函数中初始化。因此,根据所使用的构造函数,readonly 字段可能具有不同的值。
  • const 字段是编译时常数,而 readonly 字段可用于运行时常数。
  • const 默认就是静态的,而 readonly 如果设置成静态的就必须显示声明。
  • const 对于引用类型的常数,可能的值只能是 string 和 null。
    readonly可以是任何类型

总结:const只能在初期就使用常量初始化好。对于每一次编译后的结果,const的值都是固定的,而readonly的值是可以在运行的时候才确定值得。

继承

  • 代码中的继承用于定义属于关系,派生类是对积累的特化。
  • 派生:定义派生类需要在类标识符后面添加一个冒号,接着添加基类名称。
  • 通过继承,基类的每个成员都会出现在派生类的链条中。
  • 除非明确定义了基类,否则所有类都是默认从object派生。
  • 非嵌套派生类不能访问基类的私有成员
  • 基类中受保护成员只能从基类机器派生类中访问。
  • C#是单继承语言。对于需要多继承类的结构的时候一般采用聚合
  • sealed用于标记类为密封类,结果是不能从他们派生出其他类。
  • C#支持重写实例方法和属性,但是不支持重写字段或者任何静态成员。在基类中必须将允许重写的每个成员标记为virtual。
  • new和override区别

override:

  • override是派生类用来重写基类中方法的;
  • override不能重写非虚方法和静态方法;
  • override只能重写用virtual、abstract、override修饰的方法;
  • 不能使用修饰符 new、static、virtual 或 abstract 来修改 override 方法。

new:

  • new是派生类用来隐藏基类中的方法的;也就是说在派生类中“看不到”基类中的方法;
  • 如果要在派生类中隐藏(不是重写)基类中的方法,而没有使用new关键字,编译时会出现一个警告,提示如果是要隐藏基类中的方法,请使用new关键字;
  • 派生类可以隐藏基类中的虚方法,也可以隐藏基类中的普通方法。
  • 如果在派生类中用private来修饰new 方法,那么只在该派生类中隐藏了基类中的方法,在该派生类之外,相当于没有隐藏基类中的方法;
  • 如果在派生类中隐藏了基类中的方法,在该派生类的派生类中,将延续对该派生类对基类方法的隐藏。
  • 抽象成员是实现多态性的一个手段。基类指定方法的签名。而派生类提供具体的实现。

接口

关键字: interface

使用目的:抽象类所拥有的共性,也可以概括为:为了多态。

特点:

1.接口中只能包含方法。(方法、属性、索引器、事件)

2.接口中的方法不能有任何实现和数据

3.接口中的成员不能有任何访问修饰符(哪怕是public),所有成员都自动定义为公共成员。

4.接口不能被实例化,所以接口没有构造器或终结器。使用实例化实现接口类型,才能使用接口实例。此外,接口不能包含静态成员。

5.实现接口的类,必须实现接口的所有成员(这里跟抽象类一样)

6.类不能多继承,所以在某些情况下,只能用接口来代替。接口可以多实现(一个类可以继承多个接口,而只能继承一个类)

7.接口的主要目的就是为了实现多态

8.当一个类,同时继承了某个类,并且也实现了某些接口的时候,必须要将继承的类写在第一个(如果一个类同时继承了父类和接口的时候,要把父类写在最前面)

9.当多个类,都具有某个或某几个功能时(方法),但是这几个类型又不属于相同的系列(这几个类型没有共同的父类,就不能用抽象类。),所以这时,为了实现多态就可以考虑把这几个类型共有的方法提取到一个接口中,让这几个类型分别实现该接口

10.当父类实现接口,子类继承父类。那么 接口就可以引用子类

11.不要在一个接口中写过多的方法,避免造成接口污染。可编写多个接口,在每个接口中,分别定义方法

12.实现接口方法的时候,不要有override关键字,直接跟平常定义一样

13.接口方法的显示实现,如果多个接口里有相同的方法名。那么第一个方法名默认的引用的是排在最前面的接口,如果要使用后面接口的方法,就要显示实现:接口名.方法名。访问修饰符是private
  • 在类型中实现接口成员是有两种方式:显示和隐式。
    • 显示实现的方法只能通过接口本身的调用,最典型的做法就是将对象转型为接口。
    • 要隐式实现成员,只要求成员是公共的,而且前面与接口成员的签名相符。换言之,隐式成员实现不要求执行转型,业务成员可以直接调用,没有在实现它的类型中被隐藏起来。

接口与抽象类的比较

接口 抽象类
多继承 支持 不支持
类型限制 没有 有,只能是引用类型
方法实现 继承类型中必须给出方法实现 继承类中可以不给出
扩展性 比较麻烦 相对比较灵活
多层继承 比较麻烦,需要借助虚函数 比较灵活
实例化 不,只能实例化一个实现类型 不,只能实例化一个派生类

一般来说优先选择类而不是接口。但是想在已从其他类型派生的类型上支持接口所定义的功能是,就考虑定义接口。

发布了47 篇原创文章 · 获赞 35 · 访问量 3251

猜你喜欢

转载自blog.csdn.net/issunmingzhi/article/details/100705752
今日推荐