2016-12-25 62 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。希望这会帮助你。

相关问题