C#子类如何覆写基类中定义的冲突异常逻辑?
解决方案
1. 定义三个自定义异常
先创建三个对应不同错误场景的异常类,明确区分规则:
// 公共异常:不定式不符合-en/-rn结尾要求 public class InvalidInfinitiveException : Exception { public InvalidInfinitiveException(string message) : base(message) { } } // 规则动词专属异常:第三人称单数未以-t结尾 public class RegularVerbThirdPersonException : Exception { public RegularVerbThirdPersonException(string message) : base(message) { } } // 情态动词专属异常:第三人称单数以-t结尾(违反规则) public class ModalVerbThirdPersonException : Exception { public ModalVerbThirdPersonException(string message) : base(message) { } }
2. 重构基类GermanVerb
把公共的不定式检查放在基类构造函数里(确保所有子类强制遵守),将第三人称单数的检查逻辑设为虚方法,让子类可以按需重写:
public class GermanVerb { public string Infinitive { get; } public string ThirdPersonSingular { get; } public GermanVerb(string infinitive, string thirdPersonSingular) { // 公共规则校验:所有动词必须通过 if (!infinitive.EndsWith("-en") && !infinitive.EndsWith("-rn")) { throw new InvalidInfinitiveException($"动词不定式 {infinitive} 必须以-en或-rn结尾"); } Infinitive = infinitive; ThirdPersonSingular = thirdPersonSingular; // 执行当前类的第三人称校验逻辑 ValidateThirdPersonForm(); } // 虚方法:规则动词的默认校验逻辑,子类可覆盖 protected virtual void ValidateThirdPersonForm() { if (!ThirdPersonSingular.EndsWith("-t")) { throw new RegularVerbThirdPersonException($"规则动词第三人称单数 {ThirdPersonSingular} 必须以-t结尾"); } } }
3. 实现子类GermanVerbLikeModal
子类直接重写基类的ValidateThirdPersonForm方法,替换为情态动词的专属校验逻辑,完全覆盖基类的异常规则:
public class GermanVerbLikeModal : GermanVerb { public GermanVerbLikeModal(string infinitive, string thirdPersonSingular) : base(infinitive, thirdPersonSingular) { } // 重写虚方法,实现情态动词的校验规则 protected override void ValidateThirdPersonForm() { if (ThirdPersonSingular.EndsWith("-t")) { throw new ModalVerbThirdPersonException($"情态动词第三人称单数 {ThirdPersonSingular} 不能以-t结尾"); } } }
逻辑说明
- 公共规则(不定式结尾检查)在基类构造函数中强制执行,所有子类自动继承,无需重复编码。
- 借助虚方法重写机制,子类可以彻底替换基类的第三人称校验逻辑,解决继承冲突问题。
- 三个自定义异常分别对应不同错误场景,调用方能够精准捕获并处理特定类型的错误。
内容的提问来源于stack exchange,提问作者swrutra
相关产品推荐
相关产品推荐

