首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我应该让这个方法成为虚拟的还是抽象的?

我应该让这个方法成为虚拟的还是抽象的?
EN

Stack Overflow用户
提问于 2020-06-02 10:10:12
回答 4查看 92关注 0票数 3

我有一个自己进行内部验证的抽象类。它还有另一个方法,允许子类执行额外的验证检查。目前,我已经将方法设置为abstract

代码语言:javascript
运行
复制
protected abstract bool ValidateFurther();

然而,我看到相当多的子类被迫重写它,仅仅是为了返回true。我正在考虑让这个方法成为virtual

代码语言:javascript
运行
复制
protected virtual bool ValidateFurther() => true;

假设验证在抽象类中会很好,这是不是很糟糕?我担心子类可能不会注意到它,甚至在需要的时候也不会覆盖它。在这里,哪种方法更合适?

EN

回答 4

Stack Overflow用户

发布于 2020-06-02 11:10:25

您可以在您的设计中添加另一个层。

代码语言:javascript
运行
复制
public abstract class Base
{
    protected abstract bool ValidateFurther();
}

public abstract class BaseWithValidation : Base
{
    protected override bool ValidateFurther() => true;
}

如果继承类的一个重要子集应该只返回true,那么可以使用BaseWithValidation来避免在任何地方重复代码;对于其他任何情况,可以使用Base

票数 1
EN

Stack Overflow用户

发布于 2020-06-02 12:00:36

  • abstract方法意味着您只想定义要遵循的行为,而让子类执行implementation.
  • virtual方法意味着您定义了一个具有初始实现的方法,但允许其被重写。

所以也许你可以更多地解释你的背景,然后我们可以讨论它!

票数 0
EN

Stack Overflow用户

发布于 2020-06-02 16:16:10

可以将该方法设为virtual,并定义一个返回true的默认实现。

代码语言:javascript
运行
复制
protected virtual bool ValidateFurther() => true;

abstractvirtual之间的区别在于,抽象方法只定义方法的签名,而实现则由派生类实现(类似于接口)。所有子类都需要实现抽象方法的逻辑。您可以查看documentation了解更多详细信息。

另一方面,Virtual要求您实现逻辑,如果需要,您可以override该方法来添加/扩展逻辑。因为您有默认逻辑,所以您的子类/派生类不需要对其进行override。您可以查看documnetation了解更多详细信息。

基本上,在默认情况下,将该方法实现为virtualreturn true;是可以的。

仅供参考:从C# 8开始,您可以在接口link中使用缺省实现

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62143698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档