2017-12-05 3 views
0

私のアプリケーションでは、エンティティの一部がインターフェイス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を呼び出すことはできません。

ありがとうございました!

+5

私はあなたがそのように動作したい場合は、インターフェイスの実装のポイントを逃したと思います。それがインタフェースを実装するならば、そのインタフェースの実装を期待するものはそれを処理できるはずです。派生型かどうかは関係ありません。 – mason

+4

確かにあなたのデザインは少しばかり... "IActiveSecured"はインターフェイスを実装して以来、IActiveとして受け入れられるでしょう...そうでなければ実装してはいけません:) –

+0

私は他のコメント作成者に同意します。 'IActiveSecured'オブジェクトを除いて実装しようとしていることについて何らかの説明をすることができれば、もっと助けてくれるかもしれません。 – krillgar

答えて

1

ので、同じようUpdateItemを変更すると

public interface INonSecured 
{} 

public interface IActiveNonSecured : IActive, INonSecured 
{} 

を作成します。

public void UpdateItem(IActiveNonSecured item) 
{} 

は「非確保」という概念の追加の浮上は、あなたの意図がはるかに明確になり、あなたが言及したシナリオを防ぐことができます。

+0

もちろん!これが行く方法です。ありがとう! – Riddari

0

このコードを使用することはできますが、悪臭があります。 IActiveから継承する新しいインターフェイスがある場合は、必然的にコードを補完します。

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

あなたは、「必然的に**複雑です**」コードを意味すると思います。 – krillgar

関連する問題