繁体   English   中英

C#中的继承:何时以及何时不重写函数以故意引发“不支持”的异常?

[英]Inheritance in C#: when and when not to override a function to intentionally throw a “not supported” exception?

我创建了具有创建,更新和删除功能的通用存储库(抽象类)。

public abstract class GenericRepo<T> where T : class
{
     public virtual Task CreateAsync(T entity){ // not shown };
     public virtual Task UpdateAsync(T entity){ // not shown };
     public virtual Task DeleteAsync(T entity){ // not shown };
}

我将实现—继承此抽象类,但并非所有具体的存储库都将使用这三个类。 例如,我有一个只能创建,不能更新和不能删除的StatusLog实体:

public class StatusLogRepo : GenericRepo<StatusLog>
{
     public override Task UpdateAsync(StatusLog statusLog)
     {
           throw new NotSupportedException();
     }

     public override Task DeleteAsync(StatusLog statusLog)
     {
           throw new NotSupportedException();
     }
}

我看到其他人的代码以与上述相同的方式处理此问题,但我发现它很脏且令人不安。 我也无法覆盖这些类,希望不再调用Delete和Update函数。 那也很糟糕。 我想到了多重继承,但是C#不支持。

有两个问题:

  1. 什么时候适合覆盖函数以将其声明为“不支持”(如果曾经被调用)?
  2. 假设对#1的回答“永远不合适”,或者甚至“强烈建议我远离这种方法”,那么我该如何重组我的代码库,这样我就不必为每个具体的Repo复制粘贴相同的代码。可能需要相同的创建,更新或删除例程?

什么时候适合覆盖函数以将其声明为“不支持”(如果曾经被调用)?

根据设计的逻辑,在极少数情况下,必须重写的方法是可选的时,这是适当的。 在这种情况下,您需要为调用者提供一种调用可选方法的方法,例如:

[Flags]
enum SupportedOperations {
    Read   = 1
,   Create = 2
,   Update = 4
,   Delete = 8
}

public abstract class GenericRepo<T> where T : class {
     public virtual SupportedOperations SupportedOps {
         get {
             return 0; // Nothing is supported by default
         }
     }
     public virtual Task CreateAsync(T entity) {
         throw new NotSupportedException();
     }
     public virtual Task UpdateAsync(T entity) {
         throw new NotSupportedException();
     }
     public virtual Task DeleteAsync(T entity) {
         throw new NotSupportedException();
     }
}

通过此方法,调用者可以在进行可能引发NotSupportedException的调用之前检查SupportedOps的适当标志,以确保操作得到支持。

我想到了多重继承,但是C#不支持。

接口和扩展方法的组合使您非常接近它。 与其使用抽象类并继承默认实现,不如创建几个接口,并提供共享实现作为扩展方法,而不是使用抽象类。 这种方法使您能够构建行为类似于多重继承的浅层次结构。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM