在我的应用程序中,一些实体实现接口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,因为需要检查安全性以确保用户有权更新该项目,该怎么办?
感谢您的帮助!
答案 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
}