![](/img/trans.png)
[英]VBScript throw exception when the receiving object is C# COM object and the function has interface as parameter
[英]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#不支持。
有两个问题:
什么时候适合覆盖函数以将其声明为“不支持”(如果曾经被调用)?
根据设计的逻辑,在极少数情况下,必须重写的方法是可选的时,这是适当的。 在这种情况下,您需要为调用者提供一种不调用可选方法的方法,例如:
[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.