C#方法(1)

此篇文章是我针对自己的理解和自己对本章节的问题做出的总结,也查了一些资料。希望可以帮助大家真正的深刻地理解什么是方法,方法的各大使用;

     由于方法是声明在类中的,所以本篇内容还设计到一些类的知识,就当知识扩展了。

注:本篇文章提到的例子,将在下篇文章中举出,希望大家继续关注:

 

上图中我们概要了方法的一些重要知识点——分类;方法的重载和重写;抽象方法;密封方法。 仅靠这些简单的概述也许我们并不能完全理解这么多东西。为了使大家更加深刻的理解,并熟练的掌握,下面我们提出以下这些问题,然后一一作答:

例子连接:

 http://blog.csdn.net/hanxuemin12345/article/details/8302608

 

1,静态方法和非静态方法的区别:例子1

静态方法:不能用实例来调用,用类名调用;不能使用this关键字。

非静态方法:用实例来调用;能使用this来访问该方法。

 

2,方法重载和方法重写的不同之处:例子2

重载:类中有两个以上的同名方法,但是使用的参数个数、类型或顺序不同。

重写:派生类中重写基类中的方法。

 

3,抽象类与非抽象类的主要区别:

抽象类(关键字:abstract)

(1)不能直接实例化;(抽象类的实例化—例子3

(2)可以包含抽象成员;

(3)不能被密封——原因:因为类被密封后,其他类不能从该类继承,所以密封类不能做基类;然而抽象类中的抽象方法必须要在继承此抽象方法的派生类中重写,所以抽象类不能被密封。

(自己的理解。很简单,希望对大家有所帮助!!)

 

4,抽象方法(关键字:abstract)的声明:(例子3抽象类和抽象方法的使用)

(1)必须声明在抽象类中:

public  abstract class 抽象类名

{

     public  abstract void  抽象方法名();

(2)不能使用virtual、static和private修饰符;

为什么不能用virtual?使用virtual修饰符的方法是虚方法。virtual修饰符用在基类的方法中,表示允许派生类中对该方法重写(重写时,使用override修饰符);而抽象方法不需要使用virtual修饰符,就可以在派生类中重写(重写时,使用override))

 

5,抽象方法和虚方法的区别:

抽象方法:

(1)声明例子:  public  abstract void  method(); ;

(2)关键字:abstract;

(3)必须被派生类重写;

(4)一定没有实现体(可以看成是没有实现体的虚方法);

(5)如果类中包含抽象方法,则类就必须定义为抽象类,不论是否还包含其它一般方法;

 

虚方法:

(1)声明例子:public virtual  void  method(); ;

(2)关键字:virtual;

(3)调用虚方法时,运行时将确定调用对象是什么类的实例,并调用适当的重写方法;

(4)可以没有实现体;

总结:说白了,虚方法就是指可以被重写的方法。

 

6,抽象类和接口的相同点和不同点:

相同点:

(1)都不能实例化;

(2)都包含没有实现体的方法;

(3)派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法还包括其他成员)

 

不同点:

(1)一个类可以继承多个接口,但不能继承多个类(包括抽象类和费抽象类);

(通过接口可以实现多重继承)

(2)抽象类中可以定义成员的实现(比如,抽象类中可以定义有具体实现的方法),接口不可以;

(3)抽象类中可以包含字段、构造函数、析构函数、静态成员或常量等,接口不可以;

(4)抽象类中的成员可以是私有的(只要它们不是抽象的)、受保护的、内部的或受保护的内部成员(受保护的内部成员只能在应用程序的代码或派生类中访问),但接口中的成员必须是公共的;

 

7,抽象类和接口的应用:

抽象类:

(1)创建多个组件的多个版本时 使用;抽象类提供简单的方法来控制组件版本;

(2)设计大的功能单元时 使用;

(3)主要用于关系密切的对象;

 

接口:

(1)如果创建的功能将在大范围的全异对象间使用,则使用接口;

(2)设计小而简练的功能块时 使用;

(3)适合为不相关的类提供通用功能;

 

网上发现这个,感觉很好,分享一下

抽象类和接口的形象比喻:

1.)飞机会飞,鸟会飞,他们都继承了同一个接口“飞”;但是F22属于飞机抽象类,鸽子属于鸟抽象类。

2.) 就像铁门木门都是门(抽象类),你想要个门我给不了(不能实例化),但我可以给你个具体的铁门或木门(多态);而且只能是门,你不能说它是窗(单继承);一个门可以有锁(接口)也可以有门铃(多实现)。 门(抽象类)定义了你是什么,接口(锁)规定了你能做什么(一个接口最好只能做一件事,你不能要求锁也能发出声音吧(接口污染))。

 

8,密封类例子4密封类和密封方法的使用)

(1)关键字:sealed

(2)说明:

<1>不能作为基类被继承,但它可以继承别的类和接口;

<2>因为不能作为基类被继承,所以密封类中不能声明受保护成员或虚成员(因为受保护成员只能允许派生类访问,而虚成员只能在派生类中重写)

<3>因为不能作为基类被继承,所以密封类不能声明为抽象类,即修饰符sealed不能与abstract同时使用

9,所有类和成员都可以使用密封吗?类满足什么条件则将其密封?

密封了某个类,则其他类不能从该类继承;密封了某个成员,则派生类不能重写该成员.默认情况下,不应密封类型和成员。

 

如果类满足一下条件,则应将其密封:

(1)是静态类;

(2)包含带有安全敏感信息的继承的受保护成员;

(3)继承多个虚成员,并且密封每个成员的开发和测试开销明显大于密封整个类;

(4)是一个要求使用反射进行快速搜索的属性。密封属性可提高反射在检索属性时的性能。

 

10,密封方法例子4密封类和密封方法的使用)

(1)不是每个方法都可以声明为密封方法;

(2)只能用于对基类的虚方法进行实现,并提供具体的实现;

(3)所以,声明密封方法时,sealed总是和override同时使用;

你可能感兴趣的:(C#方法(1))