多个显式接口实现

TDa*_*ver 7 c# inheritance interface

我有以下基本界面

public interface IBaseAction
{
   bool CanAct(...)
}
Run Code Online (Sandbox Code Playgroud)

和两个继承接口说

public interface IAction1 : IBaseAction{}
Run Code Online (Sandbox Code Playgroud)

public interface IAction2 : IBaseAction{}
Run Code Online (Sandbox Code Playgroud)

我的问题是,我有一个实现这两者的类,我想实现不同的CanAct.

public class ComplexAction : IAction1, IAction2
{
   bool IAction1.CanAct(...){} //doesn't compile as CanAct is not a member of IAction1!!
}

ComplexAction c=new ComplexAction();
var a1 = (IAction1)c;
var a2 = (IAction2)c;
a1.CanSave(); //THESE TWO CALLS SHOULD BE IMPLEMENTED DIFFERENTLY
a2.CanSave();
Run Code Online (Sandbox Code Playgroud)

有一个相当干净的方式来做到这一点?
(另外,我的界面具有语义和至少三个功能,因此抛弃整个层次结构是不可能的,但是我愿意将bool CanAct复制到每个继承接口,如果这是唯一的解决方案(其中有4-6个))

Iva*_*lov 5

如果有人打电话,CLR应该做什么((IBaseAction)a1).CanSave()?可能只有一个实现IBaseAction.CanSave().所以我认为你不能在概念上做到这一点.

这是多重继承的一个基本问题,称为钻石问题.底线是:如果你点击它,你的类型层次结构设计肯定是错误的.例如,在这种特殊情况下,您最好使用Role类模型(也称为Role模式).


Dav*_*nan 5

你不能做你描述的.试想一下,如果客户端请求IBaseAction接口会发生什么.应归还哪一个?

听起来我觉得每个动作应该由不同的对象实现.