2016-12-25 14 views
0

你好,這個問題可能很愚蠢。有沒有什麼辦法可以在調用method2之前調用method1來強制c#

但仍然有任何實現先決條件的方法作爲另一種方法的方法。我正在使用Visual Studio(可能無關緊要)。

例子:

public void method1() 
{ 
    //Method 1 
} 

public void method2() 
{ 
     //Should call this only after calling method1 
} 
+0

爲什麼不從內部調用'method1()'?或者調用'method1'後將'bool'變量設置爲true,並在'method2'中檢查? –

+0

是否需要調用?或者在打電話給對方之前。 –

回答

2

想到的最簡單的事情是從方法2.執行方法一:

public void method1() 
{ 
    //Method 1 
} 

public void method2() 
{ 
    method1(); 
    // The rest of method2 code goes here... 
} 
+0

你爲什麼要保留'method1'' public'? – Sefe

+0

@Sefe:因爲可能需要調用它而不調用method2。我不可能知道這個問題,所以我把它公開了。 –

3

有幾種方法可以做到這一點:

代碼契約:

如果您使用Microsoft's Code Contract Extensions,您可以設置在method1一個標誌,你可以要求method2

private bool hasRunMethod1 = false; 

public void method1() 
{ 
    Contract.Ensures(this.hasRunMethod1); 
    //Method 1 
    hasRunMethod1 = true; 
} 

public void method2() 
{ 
    Contract.Requires(this.hasRunMethod1); 
    //Should call this only after calling method1 
} 

代碼合同的主要優點相比,在代碼中直接檢查hasRunMethod1是,靜態檢查可以檢查在編譯時的前提條件。給靜態檢查器method1一個暗示定義了一個Ensures的後置條件。

模板方法:

如果你不想使用代碼合同或(如果您的Visual Studio版本不允許它爲例),你可以不使用它們,您可以使用the template method pattern。這可能只會在特定的情況下,雖然工作:

abstract class Base { 
    private void method1() 
    { 
     //Method 1 
    } 

    private void method2() 
    { 
     //Method 2 
    } 

    protected abstract void BetweenMethod1And2(); 

    public void RunTemplateMethod() { 
     method1(); 
     BetweenMethod1And2(); 
     method2(); 
    } 
} 

你需要從Base派生並實現BetweenMethod1And2的中間代碼。

私人令牌:

另一種選擇是讓method1回報的令牌method2需求,但只有它可以提供。你會雖然需要確保只有method1可以用私有實現抽象類的實現它,例如:

abstract class Token {}; 

class EncapsulatingClass { 
    private class PrivateToken : Token {}; 

    public Token method1() 
    { 
     //Method 1 
     return new PrivateToken(); 
    } 

    public void method2(Token token) 
    { 
     if ((token as PrivateToken) == null) { 
      throw new ArgumentException(); 
     } 
     //Method 2 
    } 
} 
0

正如已經建議上面可以從第一個方法本身的調用第二種方法。請注意,如果您希望僅爲某些特定目的調用第二種方法,則可以使用條件運算符(如果等),並按照您的要求調用method2。希望這會幫助你。

相關問題