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

1.C#类和接口的区别

接口是负责功能的定义,项目中通过接口来规范类,操作类以及抽象类的概念!

而类是负责功能的具体实现!

在类中也有抽象类的定义,抽象类与接口的区别在于:

抽象类是一个不完全的类,类里面有抽象的方法,属性,也可以有具体的方法和属性,需要进一步的专业化。

但接口是一个行为的规范,里面的所有东西都是抽象的!

一个类只可以继承一个基类也就是父类,但可以实现多个接口

PS:
接口除了规范一个行为之外,在具体项目中的实际作用也是十分重要的,在面向对象的设计原则以及设计模式的使用中,无不体现作为一个接口的使用好处,最直接
的就是设计

原则中OCP(开放封闭原则),我们使用接口,而不需要关心他的具体实现,具体实现的细节变化也无关客户端(使用接口的类)的使用,对与扩展是
开放的,我们可以另写一个接口

的实现来扩展当前程序,而不影响上层的使用,但对修改是封闭的,即我们不能够再去修改接口的定义,当然这个“不能够”是指在
规范原则上不应该这么做!  

2.抽象类和接口的区别

答:

抽象类(abstract class)可以包含功能定义和实现,接口(interface)只能包含功能定义

抽象类是从一系列相关对象中抽象出来的概念, 因此反映的是事物的内部共性;接口是为了满足外部调用而定义的一个功能约定, 因此反映的是事物的外部特性

分析对象,提炼内部共性形成抽象类,用以表示对象本质,即“是什么”

为外部提供调用或功能需要扩充时优先使用接口

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

4.结构和类的区别
答:
  1) 结构是一个值类型,保存在栈上,而类是一个引用类型,保存在受管制的堆上。
  2) 对结构中的数据进行操作比对类或对象中的数据进行操作速度要快。
  3) 一般用结构存储多种类型的数据,当创建一个很多类或对象共用的小型对象时,使用结构效率更高。

5.抽象方法和虚方法的区别

抽象方法

使用abstract关键字 public abstract bool Withdraw(…);

抽象方法是必须被派生类覆写的方法。

抽象方法是可以看成是没有实现体的虚方法

如果类中包含抽象方法,那么类就必须定义为抽象类,不论是否还包含其它一般方法

虚方法

使用virtual关键字 public virtual bool Withdraw(…);

调用虚方法,运行时将确定调用对象是什么类的实例,并调用适当的覆写的方法。

虚方法可以有实现体

虚拟方法和抽象方法有什么区别?

抽象方法只有声明没有实现,需要在子类中实现;虚拟方法有声明和实现,并且可以在子类中覆盖,也可以不覆盖使用父类的默认实现

虚拟方法有实现代码

抽象方法则没有,

并且抽象类不能被实例化,只能实例化实现了全部抽象方法的派生类

抽象方法是虚拟方法的一种

抽象方法没有实现,它的存在只是为派生类统一接口;派生类应该实现这个方法

如果编写一个基类,它永远不会被实现,那么就应该将这个类中的一个或多个方法定义为
抽象方法。

抽象方法只有声明没有实现,需要在子类中实现;虚拟方法有声明和实现,并且可以在子类中覆盖,也可以不覆盖使用父类的默认实现

补充一点

只允许在抽象类中使用抽象方法声明

学习

其实大家首先要搞清楚,虚方法与多态性关系密切,虚方法允许派生类完全或部分重写该类的方法,需写方法体。抽象类中可以包含抽象方法与一般的方法,抽象类不
可以new,抽象方法只是一个定义,没有方法体,也就是没有{},也不要在里面写内容。它们两个相像的一点是都用override重写

时间: 2024-09-16 11:29:13

艾伟:C#类和接口、虚方法和抽象方法及值类型和引用类型的区别的相关文章

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

1.C#类和接口的区别 接口是负责功能的定义,项目中通过接口来规范类,操作类以及抽象类的概念! 而类是负责功能的具体实现! 在类中也有抽象类的定义,抽象类与接口的区别在于: 抽象类是一个不完全的类,类里面有抽象的方法,属性,也可以有具体的方法和属性,需要进一步的专业化. 但接口是一个行为的规范,里面的所有东西都是抽象的! 一个类只可以继承一个基类也就是父类,但可以实现多个接口 PS:接口除了规范一个行为之外,在具体项目中的实际作用也是十分重要的,在面向对象的设计原则以及设计模式的使用中,无不体现

在派生类中对虚方法进行重载

先让我们回顾一下普通的方法重载.普通的方法重载指的是:类中两个以上的方法(包括隐藏的继承而来的方法),取的名字相同,只要使用的参数类型或者参数个数不同,编译器便知道在何种情况下应该调用哪个方法. 而对基类虚方法的重载是函数重载的另一种特殊形式.在派生类中重新定义此虚函数时,要求的是方法名称.返回值类型.参数表中的参数个数.类型.顺序都必须与基类中的虚函数完全一致.在派生类中声明对虚方法的重载,要求在声明中加上override关键字,而且不能有new,static或virtual修饰符. 还是让我

java-Java方法中一个返回值类型为基本数据类型long,return语句可以是一个对象吗

问题描述 Java方法中一个返回值类型为基本数据类型long,return语句可以是一个对象吗 Java方法中一个返回值类型为基本数据类型long,return语句可以是一个对象吗 解决方案 可以返回Long对象 比如 return new Long(3); 解决方案二: long是个值类型

在JavaScript中调用Java类和接口的方法_javascript技巧

前言 本文中所有的代码使用 JavaScript 编写,但你也可以用其他兼容 JSR 223 的脚本语言.这些例子可作为脚本文件也可以在交互式 Shell 中一次运行一个语句的方式来运行.在 JavaScript 中访问对象的属性和方法的语法与 Java 语言相同. 本文包含如下几部分: 1.访问 Java 类 为了在 JavaScript 中访问原生类型或者引用 Java 类型,可以调用 Java.type() 函数,该函数根据传入的完整类名返回对应对象的类型.下面代码显示如何获取不同的对象类

两个接口有同样的方法,类实现接口的方法重写怎么写?

问题描述 两个接口有同样的方法,就是返回值不一样publicinterfaceA{publicdoublegetMoney();}publicinterfaceB{publicvoidgetMoney();}classCimplementsA,B{?????????}这时候怎么重写方法??? 解决方案 解决方案二:根据Java的重载和覆盖的定义,这样做事肯定不可以的解决方案三:方法名冲突了重载更返回值没关系只和参数个数类型有关publicclassCimplementsA,B{publicvoi

一方面:int是值类型,int a 定义在栈上;另一方面int又继承自Object类,是个类,类的对象应该在堆上

问题描述 ①inta=newint();这种写法,a中存储的是地址吗?②有人说,int是个静态类,所以可以inta:这个说法对吗?③版主说,int是值类型,在编译的时候会自动进行装箱拆箱,请问inta=10在编译时会被装箱成对象吗(如果这样岂不是更复杂了)?④一方面:int是值类型,inta定义在栈上:另一方面int又继承自Object类,是个类,类的对象应该在堆上.这不是矛盾嘛? 解决方案 解决方案二:引用楼主sshziliao3的回复: ①inta=newint();这种写法,a中存储的是地

C#类中虚方法相互调用的潜在重载错误

错误    当我们编写基类虚方法时,需要注意一个问题,就是基类中虚方法的相互调用,有可能引起派生类重载时的潜在错误隐患.当然这个错误并不是C#语言设计的缺陷,而是一个不可避免的实现而已.当然如果我们是要编写通用的组建基类,就需要注意一下了.     或许我们刚开始做OOP的时候,对于有没有方法有没有virtual根本不在乎,很多是时候我们都重写了(rewrite)了基类方法.当然在需要确定重载(override)的时候,virtual关键字限定基类方法是不可少的.那么是不时我们就可以把基类的方法

虚方法重写

1.实例解析 控制台程序 class Program { static void Main(string[] args) { DerivedType derivedInstance = new DerivedType(); string line; while ((line = Console.ReadLine()) != null) { Console.WriteLine("----"); } } } public class BadlyConstructedType { prote

Android开发中,那些让你相见恨晚的方法、类或接口

PS:本文内容来自我在知乎上对Android开发中,有哪些让你觉得相见恨晚的方法.类或接口?这一问题的回答,目前就总结这些,日后若有新的发现,随时补充.欢淫点赞. getParent().requestDisallowInterceptTouchEvent(true);剥夺父view 对touch 事件的处理权,谁用谁知道. ArgbEvaluator.evaluate(float fraction, Object startValue, Object endValue); 用于根据一个起始颜色