首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在 C# 中什么时候会使用抽象方法而不是虚拟方法?

在 C# 中,当一个方法是抽象的时候,它不能有实际的实现。抽象方法通常出现在抽象类中,这些类不能被实例化。抽象方法的主要目的是为了让继承这个抽象类的子类去实现这个方法。

虚拟方法则是允许有一个默认的实现,但是可以被子类重写。在 C# 中,虚拟方法使用关键字 virtual 进行标记。

当你需要在一个类层次结构中强制子类实现一个方法,但是不提供任何默认实现时,你应该使用抽象方法。这通常出现在你希望所有子类都实现这个方法的情况下。

例如,假设你有一个 Animal 类,你希望所有的动物子类都实现一个 MakeSound() 方法,但是你不想为 Animal 类提供一个通用的实现。在这种情况下,你可以将 Animal 类声明为抽象类,并将 MakeSound() 方法声明为抽象方法。这样,所有继承 Animal 类的子类都必须实现 MakeSound() 方法。

总之,当你需要强制子类实现一个方法,但是不提供任何默认实现时,你应该使用抽象方法。而当你希望提供一个默认的实现,并允许子类重写它时,你应该使用虚拟方法。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

为什么 build 方法放在 State 不是 StatefulWidget

为什么 build 方法放在 State 不是 StatefulWidget 呢?其中前2点是源代码的注释给出的原因,最后一点是我的一点个人理解。...是一个抽象类,其中有一个 Widget build(BuildContext context) 的抽象方法,此方法需要子类重写,AnimatedWidget 源代码如下: abstract class...闭包 this 指向异常 假设 build 方法 StatefulWidget ,StatefulWidget 的子类写法如下: class MyWidget extends StatefulWidget...如果 build 方法 State ,代码如下: class MyWidget extends StatefulWidget { final Color color; const MyWidget...性能 有状态的组件包含StatefulWidget 和 State,当有状态组件的配置发生更改时,StatefulWidget 将会被丢弃并重建, State 不会重建,框架更新 State 对象

90420

Effective Java(第三版)——条目十六:公共类中使用访问方法不是公共属性

但是,如果一个类是包级私有的,或者是一个私有的内部类,那么暴露它的数据属性就没有什么本质上的错误——假设它们提供足够描述该类提供的抽象。...类定义和使用它的客户端代码,这种方法比访问方法产生更少的视觉混乱。 虽然客户端代码绑定到类的内部表示,但是这些代码仅限于包含该类的包。...如果类的内部表示是可取的,可以不触碰包外的任何代码的情况下进行更改。 私有内部类的情况下,更改作用范围进一步限制封闭类。 Java平台类库的几个类违反了公共类不应直接暴露属性的建议。...着名的例子包括java.awt包的Point和Dimension类。 这些类别应该被视为警示性的示例,不是模仿的例子。...---- 今天小程序更新的题库: 1.为什么不建议代码中直接使用Executors创建线程池,而是推荐通过 ThreadPoolExecutor 方式创建 2.你对线程优先级的理解是什么?

83810
  • ASP.NET理论知识及面试题

    属性是方法字段不是,当你用反射去掉用的时候,它们有各自的API。因为属性是方法,所以它可以和方法那样定义接口中,或者被继承和重写,重写属性被ORM/AOP等框架用来注入代码。 4....抽象方法和虚方法的区别     抽象方法一定是虚方法,虚方法未必是抽象方法。虚方法是指可以被继承类重写的方法抽象方法是指,基类是抽象类,没有实现它,因此必须被继承类重写的方法。   ...13. c#中值类型和引用类型的区别     1.值类型的数据存储在内存的栈;引用类型的数据存储在内存的堆内存单元只存放堆对象的地址。     ...;.NET中会有GC来释放   14. c#语言中,结构体和类的区别?      ...2.使用VS.NET的Add Web Reference菜单选项   18. try{}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,

    1.8K20

    abstract virtaul override new 及多态

    抽象方法具有以下特性: 抽象方法是隐式的虚方法。 只允许抽象类中使用抽象方法声明。...静态属性上使用 virtual 修饰符是错误的。 通过包括使用 override 修饰符的属性声明,可在派生类重写虚拟继承属性。...派生类 C# ,派生类可以包含与基类方法同名的方法。 基类方法必须定义为 virtual。...如果派生类方法前面带有 override 关键字,则派生类的对象将调用该方法不是调用基类方法。 可以从派生类中使用 base 关键字调用基类方法。...override、virtual 和 new 关键字还可以用于属性、索引器和事件 C# ,派生类中方法的名称可与基类中方法的名称相同。

    77530

    第五章:面向对象编程

    new 的时候 ,直接在堆内存开辟空间。然后给所有属性赋默认值,完成对象的创建。(这个过程是构造方法体执行之前就完成了) 对象初始化什么时候完成的?...Native Method Stacks(本地方法栈):本地方法的执行过程,会使用到本地方法栈。和 Java 虚拟机栈十分相似。...方法覆盖 回顾方法重载 overload 什么时候考虑使用方法重载 一个类,如果功能相似,可以考虑使用方法重载。 这样做的目的是:代码美观,方便编程。...合成复用原则:尽量使用对象组合和聚合,不是继承来达到复用的目的。组合和聚合可以获取外部对象的方法中被调用,是一种运行时关联,继承则是一种编译时关联。...抽象什么时候考虑将类定义为抽象类? ​如果类中有些方法无法实现或者没有意义,可以将方法定义为抽象方法。类定义为抽象类。​这样抽象只提供公共代码,具体的实现强行交给子类去做。

    11511

    net开发高级面试题2021_net面试题2021

    C#的委托是什么?事件是不是一种委托?事件和委托的关系。 4.9. override 与重载(overload)的区别 4.10. 什么是装箱(boxing)和拆箱(unboxing) 1....Use 方法可以调用下一个中间件的添加, run 不会。 3.14. 依赖注入后的服务生命周期? dot net core ,我们不需要关心如何释放这些服务, 因为系统帮我们释放掉。...String 进行运算时(如赋值、拼接等)产生一个新的实例, StringBuilder 则不会。...C#的委托是什么?事件是不是一种委托?事件和委托的关系。 委托可以把一个方法作为参数代入另一个方法,可以理解为指向一个函数的指针。...事件和委托的区别如下: 事件只能在方法的外部进行声明,方法的外部和内部都可以声明。 事件只能在类的内部触发,不能在类的外部触发。委托类的内部和外都都可以触发。

    3.3K10

    c#面试题抽象类和接口的区别-金三银四面试:C#程序员经常遇到的30道基础面试题,想你所想

    由重写声明重写的方法称为重写基方法。重写基方法必须与重写方法具有相同的签名。   不能重写非虚方法或静态方法。重写基方法必须是虚拟的、抽象的或重写的。   重写声明不能更改虚方法的可访问性。...除了声明和调用语法不同外,虚拟属性的行为与抽象方法一样。   (1)静态属性上使用修饰符是错误的。   (2)通过包括使用修饰符的属性声明,可在派生类重写虚拟继承属性。   ...与out参数相比,变量传递到out参数之前不必显示初始化。属性不是变量,不能作为ref参数传递。如果两个方法的声明仅在它们对ref的使用方面不同c#面试题抽象类和接口的区别,则将出现重载。...静态构造函数的典型用途是:当类使用日志文件时,将使用这种构造函数向日志文件写入项。   12、C#如何实现多态?   ...但是也并不是C#不支持指针c#面试题抽象类和接口的区别,我们可以使用unsafe关键词,开启不安全代码(unsafe code)开发模式。不安全模式下,我们可以直接操作内存,这样就可以使用指针了。

    1.9K20

    C#抽象类与抽象方法的作用与实例

    C#,允许把类和方法声明为抽象类与抽象方法,具体的声明方法类名或方法名前加上abstract关键字。 那么我们什么时候应该用抽象类呢?...(抽象类、虚方法需要加override) 二、抽象抽象类,面向对象过程,所有的对象都是类描绘的,反过来,类里面的数据不足以把具体的对象描绘出来,这样的类就是抽象类 1、抽象方法只能出现在抽象...2、父类定义的抽象方法不能实现。 3、抽象类不能实例化(也就是不能new出来)。 4、抽象类与抽象方法需要添加abstract关键字。...5、子类实现父类的抽象方法时,需要添加override关键字。 6、如果抽象类的子类不是抽象类,那么子类必须重写父类抽象类的所有抽象方法。...10.如果要设计小简练的功能块,则使用接口,如果要设计大的功能单元,则使用抽象类   11.接口对应是面向对象编程思想的重要原则:面向接口编程,

    1.7K10

    C#简单的面试题目(一)

    internal:同一个程序集内可以访问.----@无机の剑执政的, 多谢博友 2.private 私有成员会被继承吗?   ,但是不能访问。...接口(Interface)是用来定义行为规范的,不会有具体实现,抽象类除定义行为规范外,可以有部分实现,但一个类能实现多个接口,但只能继承一个父类 9.什么时候使用抽象类,什么时候用接口   接口用于规范...接口中只能声明方法、属性、事件、索引器。抽象可以有方法的实现,也可以定义非静态的类变量。抽象类是类,所以只能被单继承,但是接口却可以一次实现多个。抽象了可以提供某些方法的部分实现,接口不可以。...抽象类的实例是它的子类给出的。接口的实例是实现接口的类给出的。抽象假如一个方法,那么它的子类就同时有了这个方法。...12.何时必须声明一个类为抽象类?   当这个类包含抽象方法时,或是该类并没有完全实现父类的抽象方法时。 13.为什么不能指定接口中方法的修饰符?

    97330

    C# .NET面试系列二:面向对象

    抽象类支持构造函数、字段和成员访问修饰符,接口只支持方法签名。设计,要根据具体的需求和场景选择使用抽象类还是接口。6. 类的执行顺序?...C#,接口是可以继承其他接口的,抽象类既可以实现(implements)接口,也可以继承实现类(concrete class)。...静态变量、静态成员和非静态成员是面向对象编程的概念,它们有不同的特性和使用方式。静态变量:静态变量是属于类不是属于类的实例的变量。...这种方法推崇通过定义和实现接口来组织代码,以实现解耦合、可扩展性和代码复用的目标。面向接口开发,重视设计良好的接口,使得不同的组件可以通过接口进行通信,不是直接依赖于具体的实现。...C#,静态方法不能直接访问非静态变量。这是因为静态方法是与类关联的,而非静态变量是与类的实例关联的。静态方法,没有隐式的 this 实例,因为静态方法是属于整个类不是类的实例的。

    22910

    程序员级别鉴定书(.NET面试问答集锦)

    当进程使用它时需要什么ACL权限? 为何catch(Exception)的使用通常都不是一个好办法? Debug.Write 和 Trace.Write 的区别是什么? 应在什么时候使用它们?...使用.NET你如何验证XML? 为什么这句代码通常是不好的?什么时候好? 和 eventing-readers (Sax) 这两者间的异同。...比如系统中有多个地方都用到文件上传功能,可以使用面向方面的思想在所有上传文件之前对文件的大小、格式等信息进行过滤操作,不是每处上传代码里面完成对这些信息的过滤。 接口和类的区别?...Catch的时候应该捕捉具体的Exception类型,不是通用的Exception Debug.Write 和 Trace.Write 的区别是什么? 应在什么时候使用它们?...可以静态方法调用 this 吗? This 用于调用当前实例,无法 static 方法调用 this。

    1.8K70

    知识回顾:抽象类与抽象方法

    C#允许把类和方法声明为抽象类与抽象方法,声明方法类名或方法名前加上 abstract 关键字。定义很简单,但是你有没有想过什么时候应该用抽象类呢?...同时如果所有用户都必须声明Login方法的话,那么可以User类声明一个抽象方法Login,让所有继承自User的类都去重写Login方法。...抽象面向对象过程中所有的对象都是类描绘的,类里面的数据不足以把具体的对象描绘出来,这样的类就是抽象类,下面是抽象类的定义: 抽象方法只能出现在抽象,但是抽象可以包含普通方法抽象类不能实例化...; 抽象类与抽象方法需要添加abstract关键字; 子类实现父类的抽象方法时需添加override关键字; 如果抽象类的子类不是抽象类,那么子类必须重写父类抽象类的所有抽象方法。...,接口则是适合为不相关的类提供通用功能、接口着重于Can-Do关系类型,抽象类则偏重于IS-A式关系、接口定义对象的行为,抽象类定义对象的属性、如果要设计小简练的功能块,则使用接口,如果要设计大的功能单元

    31940

    unity c#面试_spring面试题及答案

    接口只是定义各方法,并没有具提实现,子类继承抽象父类,可以只是继承部分方法或直接引用父类的方法。...8.请简述关键字Sealed用在类声明和函数声明时的作用 答:类声明时可防止其他类继承此类,方法声明则可防止派生类重写此方法。...我的推论是,mono是一种中间语言,内核还是.net的一个简化版的虚拟机,能跨平台运行,这个虚拟机类似于jvm虚拟机,提供各种框架,API和程序执行和调用功能,但明显支持的最强语言还是C# 12.简述...UIRoot提供了这3种适配方法 21.为什么dynamic fontunicode环境下优于static font 使用动态字体时,Unity将不会预先生成一个与所有字体的字符纹理, 静态字体体积很大...Prefab实例化的时候用到,主要用于经常会用到的物体做成一个集合方便反复使用移动环境,由于Prefab一般体积比较大,常需要实例化,拆分成合适大小的AssetBundle,离线下载比较恰当 26

    1.3K20

    asp.net面试题

    Redirect()…. 2.使用Session变量 3.使用Server.Transfer 4.C#的委托是什么?事件是不是一种委托? 答 : 委托可以把一个方法作为参数代入另一个方法。...24.C#,string str = null 与 string str = “” 请尽量使用文字或图 象说明其中的区别。...43.try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code 不会被执行,什么时候被执行,return前还是后? 答:执行,return前执行。...121.描述一下C#索引器的实现过程,是否只能根据数字进行索引? 答:不是。可以用任意类型。...取而代之,子类实现该方法。知道其行为的其它类可以实现 这些方法。 接口(interface)是抽象类的变体。接口中,所有方法都是抽象的。多继承性 可通过实现这样的接口获得。

    1.1K10

    Java面试题库及答案解析

    抽象 抽象是把想法从具体的实例中分离出来的步骤,因此,要根据他们的功能不是实现细节来创建类。Java支持创建只暴露接口不包含方法实现的抽象的类。...监视器和锁在Java虚拟是一起使用的。监视器监视同步代码块,确保一次只有一个线程执行同步代码块。每一个监视器都和一个对象引用相关联。线程获取锁之前不允许执行同步代码。...什么时候应该使用Array不是ArrayList? Array 和ArrayList 有以下的不同点: Array可以包含基本类型和对象类型,ArrayList只能包含对象类型。...一般建议方法释放对象持有的资源。 40、如果对象的引用被置为null,垃圾收集器是否立即释放对象占用的内存? 不会,在下一个垃圾回收周期中,这个对象将是可被回收的。...43、Java,对象什么时候可以被垃圾回收? 当对象对当前使用这个对象的应用程序变得不可触及的时候,这个对象就可以被回收了。 44、JVM的永久代中会发生垃圾回收么?

    1.2K50

    .NET、C#基础知识

    C#面向对象思想主要包括:封装,继承,多态: 封装:用抽象的数据类型将数据类型和基本的方法操作封装在一起,在数据保护抽象类型内部 (封装就是把数据或者函数集合在一个个的类,封装的对象被称为抽象对象,...取而代之,子类实现该方法。知道其行为的其它类可以实现这些方法。 接口(interface)是抽象类的变体。接口中,所有方法都是抽象的。多继承性可通过实现这样的接口获得。...属于拆箱 接口含义:接口是指一组函数成员不实现他们的引用类型,通常只能通过接和类的继承,继承接口要实 其全部方法 什么时候使用抽象类,什么时候用接口 : 接口用于规范,抽象类用于共性。...c#继承: base表示对象基类的实例(使用base可以调用基类的成员)base 表示当前对象基类的实例(使用base关键字可以调用基类的成员)this表示当前类的实例 静态方法不可以使用base...如何在C#实现继承? 类名后加上一个冒号,再加上基类的名称。 私有成员会被继承么? ,但是不能被访问。所以看上去他们似乎是不能被继承的,但实际上确实被继承了。

    1.6K10

    asp.net面试题130道「建议收藏」

    24.C#,string str = null 与 string str = “” 请尽量使用文字或图象说明其中的区别。...43.try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,return前还是后? 答:执行,return前执行。...121.描述一下C#索引器的实现过程,是否只能根据数字进行索引? 答:不是。可以用任意类型。...答:声明方法的存在不去实现它的类被叫做抽象类(abstract class),它用 于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类实现 该类的情况。...取而代之,子类实现该方法。知道其行为的其它类可以实现 这些方法。 接口(interface)是抽象类的变体。接口中,所有方法都是抽象的。多继承性 可通过实现这样的接口获得。

    84210

    java50道基础面试题

    监视器和锁在Java虚拟是一块使用的。监视器监视一块同步代码块,确保一次只有一个线程执行同步代码块。每一个监视器都和一个对象引用相关联。线程获取锁之前不允许执行同步代码。...什么时候应该使用Array不是ArrayList? 下面列出了Array和ArrayList的不同点: Array可以包含基本类型和对象类型,ArrayList只能包含对象类型。...41.Java,对象什么时候可以被垃圾回收? 当对象对当前使用这个对象的应用程序变得不可触及的时候,这个对象就可以被回收了。 42.JVM的永久代中会发生垃圾回收么?...最大的不同是,Hashtable 的方法是Synchronize的,HashMap不是多个线程访问Hashtable时,不需要自己为它的方法实现同步,HashMap 就必须为之 提供外同步。...50.try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,return前还是后? 执行,return前执行。

    63270

    C# 的继承

    继承是面向对象编程(OOP)的核心特性之一,它允许一个类(称为子类或派生类)继承另一个类(称为基类或父类)的属性和方法C#,继承不仅提供了代码重用的功能,还支持多态和扩展现有功能。...多继承:一个类继承多个基类(C#不支持,但可以通过接口实现类似的功能)。2. 实现继承2.1 使用:关键字C#使用冒号(:)关键字来指定一个类继承另一个类。...继承的高级特性3.1 抽象抽象类是不能被实例化的类,它包含一个或多个抽象方法,这些方法必须在派生类实现。...4.3 使用抽象类和接口当需要强制实现特定方法时,使用抽象类;当需要实现多种行为时,使用接口。4.4 避免过度使用密封过度使用密封限制代码的灵活性和扩展性。...4.5 考虑使用虚拟方法和重写虚拟方法和重写是实现多态的强大工具,但应谨慎使用,以避免复杂的继承关系。

    83210

    C# 基础知识系列- 4 面向对象

    #称为Field,也就是字段的意思; public static int Count 和public string Name 这两个C#称为Property,也就是属性的意思。...比如说,我们去找领导签字,领导忙让我们把文件放那边,过一领导派人送过来签好字的文件。如果领导有多只钢笔,那么领导用哪只笔、什么时候、用什么姿势对于我们来说就是不确定的状态,这就是多态的一种。...访问控制符 讲三大特性之前,先介绍一下 C#的访问控制。...B的SetName 方法 b.Say();// 调用的是 B Say方法 类和接口 C#类和接口的声明方式不同,类用的关键字是class,接口用的是interface。...返回 Hash值,某些集合和程序机制以HashCode作为元素的相等性判断依据,所以重写 Equals 之后也要重写 这个方法,并保证两个方法对于相同的对象做相等性结果判定是应该表现一致。

    50430
    领券