2015-12-14 3 views
0

У меня есть методывозврата из метода вызова

public void x() 
{ 
    y(); 
    z(); 
} 

public void y() 
{ 
    if(some condition) return; 
    some code... 
} 

public void z() 
{ 
    somecode... 
} 

Я знаю, что заявление возвращения в method y() будет возвращено без выполнения что-нибудь еще в этом методе, если условие somecondition выполняется и возвращается обратно в method x() и выполните команду method z(). Но есть ли способ вернуться с method x(), не выполнив method z()?

Я не могу изменить какие-либо ограничения или редактировать method y

+0

Каковы ограничения? Можете ли вы изменить подписи методов? –

+0

Невозможно изменить ограничения или метод редактирования y(). –

+3

Если вы не можете изменить 'y', вам нужно будет повторить код' if (some condition) 'либо в' x', либо 'z', чтобы сделать эту работу. С кодом, который вы нам показали, нет другого пути. – Enigmativity

ответ

5

Make y() вернуть какой-кода, чтобы x() знаю, стоит ли называть z() или нет.

public void x() 
{ 
    if (y()) 
    { 
     z(); 
    } 
} 

// Return true if processing should continue. 
// 
public bool y() 
{ 
    if(some condition) return false; 
    some code... 
    return true; 
} 

public void z() 
{ 
    somecode... 
} 
+0

большой .. действительно заметный –

+0

благодарит за ваш ответ! но я не могу изменить тип возврата для метода y. Извините, отредактировал мой вопрос. –

+0

Если вы не можете изменить 'y()', тогда нет простого способа выскочить из 'x()' it, если 'y' уже не устанавливает что-то, чтобы вы знали, что он был вызван. Вы должны иметь такое же условие в 'x', которое является дублированным кодом и сложно поддерживать. – John3136

1

Одним из вариантов является возвращение значения bool из y().

public void x() 
{ 
    var isValidY = y(); 

    if (isValidY) 
     z(); 
} 

public bool y() 
{ 
    if(some condition) return false; 

    // some code... 
    return true; 
} 

public void z() 
{ 
    // some code... 
} 

Если вы не можете изменить y(), то вы должны будете взять совет Enigmativity оставил в комментариях, и повторить логику, представленную some condition:

public void x() 
{ 
    y(); 
    if (some condition) return; 
    z(); 
} 

public bool y() 
{ 
    if (some condition) return; 
    // some code... 
} 
+0

приятно, но этого можно избежать из-за дополнительной декларации 'isValidY'. –

+0

@ un-lucky Вы правы, но общие имена методов прослушивали меня, и я чувствовал, что это сделало цель более ясным, чем 'if (y()) z();' –

+0

сожалеет об общих именах –

0

Если вы не можете изменить сигнатуры метода, сделать глобальную переменную флага:

private bool shouldContinue = true; 

public void x() 
{ 
    y(); 

    if(shouldContinue) 
     z(); 
} 

public void y() 
{ 
    if(some condition) 
    { 
     shouldContinue = false; 
     return; 
    } 
    some code... 
} 

public void z() 
{ 
    somecode... 
}