2016-12-15 5 views
0

C#言語では、私はインターフェイスISenderとこのインターフェイスを実装するクラスがあると仮定しましょう。また、ISenderを実装するクラスに、Send()メソッドを呼び出す必要があります。ValidateContent()などのメソッドを呼び出す必要があります。C#のメソッドへのインタフェース?

public interface ISender { 
    void Send(); // How to declare that Send() must invoke ValidateContent within itself? 
} 

public class EmailReportSender : ISender { 
    public void Send(){ 
     ValidateContent(); 
     // Do stuff 
    } 
} 
public class IPhoneNotificationReportSender : ISender { 
    public void Send(){ 
     ValidateContent(); 
    } 
} 
+1

質問はしていませんか?しかし、あなたは抽象クラスをインターフェイスよりも必要としているようです。 – Jonesopolis

+0

なんで?質問はなんですか? – esiprogrammer

答えて

0

これはインターフェイスでは実行できません。あなたは、ロジックを逆さまにして、テンプレートパターンを使用します。起こる必要のある「アルゴリズム」を定義した1つの基本メソッドを持ち、サブクラス固有のポイントを延期する:

+0

は私にそれを打ち負かすことができました。 – iheanyi

+0

私はそれに気づいた。 nice – Jonesopolis

+0

実際、私は私の出版する機会がありませんでした。 BJ Myersのように見えるが同じ波長にあった。 – iheanyi

1

インタフェースを実装する必要があります方法を説明しますが、それらは実装が実際に何をしなければならないか実装や方法には発言権を持っていません。

ただし、抽象メソッドを拡張ポイントとして使用しながら、抽象クラスを使用して動作を定義することができます。非抽象パブリックメソッドと抽象メソッドの組み合わせは、あなたが望むことを行うことができます。

public abstract class Sender 
{ 
    public void Send() 
    { 
     ValidateContent(); 
     DoSend(); 
    } 

    private void ValidateContent() 
    { 
     // Put validation code here 
    } 

    protected abstract void DoSend(); 
} 

public class EmailReportSender : Sender 
{ 
    protected override void DoSend() 
    { 
     // Do stuff 
    } 
} 
public class IPhoneNotificationReportSender : Sender 
{ 
    protected override void DoSend() 
    { 
     // Do stuff 
    } 
} 
-2

これは単体テストの仕事のようです。あなたのコンパイラはそれを強制するつもりはありませんが、もしルールが存在すればそれに応じてテストする必要があります。以下はMoqを使用しています。

[TestFixture] 
public class EmailReportSenderTests 
{ 
    [Test] 
    public void EmailReportSender_Send_CallsValidateContent() 
    { 
     var mock = new Mock<ISender>(); 
     mock.Setup(m => m.Send()).Verifiable(); 

     var sender = new EmailReportSender(mock.Object); 
     sender.Send(); 

     mock.Verify(m => m.ValidateContent()); 
    } 
} 

私はこのスニペットを試していないので、タイプミスが発生する可能性があります。

関連する問題