我有一个自己进行内部验证的抽象类。它还有另一个方法,允许子类执行额外的验证检查。目前,我已经将方法设置为abstract。
protected abstract bool ValidateFurther();然而,我看到相当多的子类被迫重写它,仅仅是为了返回true。我正在考虑让这个方法成为virtual。
protected virtual bool ValidateFurther() => true;假设验证在抽象类中会很好,这是不是很糟糕?我担心子类可能不会注意到它,甚至在需要的时候也不会覆盖它。在这里,哪种方法更合适?
发布于 2020-06-02 11:10:25
您可以在您的设计中添加另一个层。
public abstract class Base
{
protected abstract bool ValidateFurther();
}
public abstract class BaseWithValidation : Base
{
protected override bool ValidateFurther() => true;
}如果继承类的一个重要子集应该只返回true,那么可以使用BaseWithValidation来避免在任何地方重复代码;对于其他任何情况,可以使用Base。
发布于 2020-06-02 12:00:36
abstract方法意味着您只想定义要遵循的行为,而让子类执行implementation.virtual方法意味着您定义了一个具有初始实现的方法,但允许其被重写。所以也许你可以更多地解释你的背景,然后我们可以讨论它!
发布于 2020-06-02 16:16:10
可以将该方法设为virtual,并定义一个返回true的默认实现。
protected virtual bool ValidateFurther() => true;abstract和virtual之间的区别在于,抽象方法只定义方法的签名,而实现则由派生类实现(类似于接口)。所有子类都需要实现抽象方法的逻辑。您可以查看documentation了解更多详细信息。
另一方面,Virtual要求您实现逻辑,如果需要,您可以override该方法来添加/扩展逻辑。因为您有默认逻辑,所以您的子类/派生类不需要对其进行override。您可以查看documnetation了解更多详细信息。
基本上,在默认情况下,将该方法实现为virtual和return true;是可以的。
仅供参考:从C# 8开始,您可以在接口link中使用缺省实现
https://stackoverflow.com/questions/62143698
复制相似问题