C#类和接口、虚方法和抽象方法及值类型和引用类型的区别

来源:互联网 发布:fireworks mac 中文版 编辑:程序博客网 时间:2024/05/22 14:37

C#类和接口、虚方法和抽象方法及值类型和引用类型的区别

1. C#类和接口的区别: 接口是负责功能的定义(Interfaceis responsible for the definition of functions),项目中通过接口来规范类(Projectstandardize the class through interface),操作类以及抽象类的概念!而类是负责功能的具体实现(But class is responsible for the concrete realization of functions)!在类中也有抽象类的定义,抽象类与接口的区别在于:抽象类是一个不完全的类(abstract class is an incomplete class),类里面有抽象的方法,属性,也可以有具体的方法和属性,需要进一步的专业化。但接口是一个行为的规范(interface standardizes the behavior),里面的所有东西都是抽象的!一个类只可以继承一个基类也就是父类,但可以实现多个接口 PS:接口除了规范一个行为之外,在具体项目中的实际作用也是十分重要的,在面向对象的设计原则以及设计模式的使用中,无不体现作为一个接口的使用好处,最直接的就是设计原则中OCP(开放封闭原则),我们使用接口,而不需要关心他的具体实现,具体实现的细节变化也无关客户端(使用接口的类)的使用,对与扩展是开放的,我们可以另写一个接口的实现来扩展当前程序,而不影响上层的使用,但对修改是封闭的,即我们不能够再去修改接口的定义,当然这个“不能够”是指在规范原则上不应该这么做!

2. 抽象类和接口的区别:抽象类(abstractclass)可以包含功能定义和实现,接口(interface)只能包含功能定义抽象类是从一系列相关对象中抽象出来的概念,因此反映的是事物的内部共性;接口是为了满足外部调用而定义的一个功能约定,因此反映的是事物的外部特性分析对象,提炼内部共性形成抽象类,用以表示对象本质,即“是什么” 为外部提供调用或功能需要扩充时优先使用接口

 3.  C#语言中,值类型和引用类型有何不同? 解答  值类型和引用类型的区别在于,值类型的变量直接存放实际的数据,而引用类型的变量存放的则是数据的地址,即对象的引用。  值类型变量直接把变量的值保存在堆栈中,引用类型的变量把实际数据的地址保存在堆栈中,而实际数据则保存在堆中。注意,堆和堆栈是两个不同的概念,在内存中的存储位置也不相同,堆一般用于存储可变长度的数据,如字符串类型;而堆栈则用于存储固定长度的数据,如整型类型的数据int(每个int变量占用四个字节)。由数据存储的位置可以得知,当把一个值变量赋给另一个值变量时,会在堆栈中保存两个完全相同的值;而把一个引用变量赋给另一个引用变量,则会在堆栈中保存对同一个堆位置的两个引用,即在堆栈中保存的是同一个堆的地址。在进行数据操作时,对于值类型,由于每个变量都有自己的值,因此对一个变量的操作不会影响到其它变量;对于引用类型的变量,对一个变量的数据进行操作就是对这个变量在堆中的数据进行操作,如果两个引用类型的变量引用同一个对象,实际含义就是它们在堆栈中保存的堆的地址相同,因此对一个变量的操作就会影响到引用同一个对象的另一个变量。

 4.结构和类的区别   

1) 结构是一个值类型,保存在栈上,而类是一个引用类型,保存在受管制的堆上。  

2) 对结构中的数据进行操作比对类或对象中的数据进行操作速度要快。  

3) 一般用结构存储多种类型的数据,当创建一个很多类或对象共用的小型对象时,使用结构效率更高。

5.  抽象方法和虚方法的区别: 抽象方法使用abstract关键字 publicabstract bool Withdraw(…); 抽象方法是必须被派生类覆写的方法。抽象方法是可以看成是没有实现体的虚方法如果类中包含抽象方法,那么类就必须定义为抽象类,不论是否还包含其它一般方法虚方法使用virtual关键字 public virtual bool Withdraw(…); 调用虚方法,运行时将确定调用对象是什么类的实例,并调用适当的覆写的方法。虚方法可以有实现体 ---------------------------------------------------------------------------------------------虚拟方法和抽象方法有什么区别?抽象方法只有声明没有实现,需要在子类中实现;虚拟方法有声明和实现,并且可以在子类中覆盖,也可以不覆盖使用父类的默认实现虚拟方法有实现代码抽象方法则没有,并且抽象类不能被实例化,只能实例化实现了全部抽象方法的派生类抽象方法是虚拟方法的一种抽象方法没有实现,它的存在只是为派生类统一接口;派生类应该实现这个方法如果编写一个基类,它永远不会被实现,那么就应该将这个类中的一个或多个方法定义为抽象方法。抽象方法只有声明没有实现,需要在子类中实现;虚拟方法有声明和实现,并且可以在子类中覆盖,也可以不覆盖使用父类的默认实现补充一点 只允许在抽象类中使用抽象方法声明 学习 其实大家首先要搞清楚,虚方法与多态性关系密切,虚方法允许派生类完全或部分重写该类的方法,需写方法体。抽象类中可以包含抽象方法与一般的方法,抽象类不可以new,抽象方法只是一个定义,没有方法体,也就是没有{},也不要在里面写内容。它们两个相像的一点是都用override重写

 

 

一、抽象类
抽象类是特殊的类,只是不能被实例化;除此以外,具有类的其他特性;重要的是抽象类可以包括抽象方法,这是普通类所不能的。抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们。另外,抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如果不覆盖,则其派生类必须覆盖它们。

抽象类实例
 1    public abstract class A
 2    {
 3        private int? num = null;
 4
 5        public int? Num
 6        {
 7            get {return num; }
 8            set {num = value; }
 9        }
10
11        public virtual int? getNum()
12        {
13            returnnum;
14        }
15
16        public void setNum(int? n)
17        {
18            this.num =n;
19        }
20
21        public abstract void F();
22    }
23
24    public abstract class B:A
25    {
26        //public override void F()
27        //{
28        //    throw newException("The method or operation is not implemented.");
29        //}
30
31        public abstract void E();
32    }
33
34    public class C : B
35    {
36        private C()
37        {
38        }
39
40        public override void E()
41        {
42            throw newException("The method or operation is not implemented.");
43        }
44
45        public override void F()
46        {
47            C c = newC();
48            throw newException("The method or operation is not implemented.");
49        }
50    }


二、接口
接口是引用类型的,类似于类,更和抽象类有所相似,以至于很多人对抽象类和接口的区别比较模糊。和抽象类的相似之处有三点:
1、不能实例化;
2、包含未实现的方法声明;
3、派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括其他成员);

接口有如下特性:
接口除了可以包含方法之外,还可以包含属性、索引器、事件,而且这些成员都被定义为公有的。除此之外,不能包含任何其他的成员,例如:常量、域、构造函数、析构函数、静态成员。
一个类可以直接继承多个接口,但只能直接继承一个类(包括抽象类)。

接口实例
 1    public delegate void Del();
 2    public interface ITest
 3    {
 4        //int ?a = null;
 5
 6        int A
 7        {
 8            get;
 9        }
10
11        void Test();
12        event Del OnDel;
13        int this[int index]
14        {
15            get;
16            set;
17        }
18    }


注意!还有另外一种类不能被实例化:
所有构造函数都被标记为private,这种类也是不能被实例化的,严格的说是不能在类外被实例化,

 

原创粉丝点击