清洁方式强制使用派生界面

时间:2017-12-05 19:24:08

标签: c# interface

在我的应用程序中,一些实体实现接口A,其他实现接口B,一些实现A和B.如何强制查看实现A和B的实体的代码使用派生接口A和B?

以下是一些例子:

接口A

public interface IActive
{
   DateTime? StartEffDT { get; set; }
   DateTime? EndEffDT { get; set; }
}

接口B

public interface ISecured
{
    object SecurityToCheck { get; set; }
}

接口A和B

public interface IActiveSecured : IActive, ISecured
{
}

方法示例

public void ExampleMethod1(IActive x) { }
public void ExampleMethod2(ISecured y) { }
public void ExampleMethod3(IActiveSecured z) { }

有没有办法强制ExampleMethod1只采用IActive,而不是IActiveSecured?

public void UpdateItem(IActive item) {
    //update the item, if it is currently active
}

如果我尝试使用IActiveSecured项目调用UpdateItem,它将起作用。毫不奇怪,这就是继承的工作方式。但是,如果我想确保您不能使用IActiveSecured调用UpdateItem,因为需要检查安全性以确保用户有权更新该项目,该怎么办?

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

创建

public interface INonSecured
{}

public interface IActiveNonSecured : IActive, INonSecured
{}

然后像这样更改UpdateItem

public void UpdateItem(IActiveNonSecured item)
{} 

“非安全”概念的额外表现使您的意图更加清晰,并阻止您提到的情景。

答案 1 :(得分:0)

您可以使用此代码,但它有难闻的气味。 如果有从IActive继承的新接口 - 将不可避免地补充代码。

public void UpdateItem(IActive item) {
    if(item is IActiveSecured)
        return;
    //do some code
}