Блоки выгоды слияния с точно тем же кодом? [дубликат]

Никогда нет точки к объявлению статического метода в интерфейсе. Они не могут быть выполнены обычным вызовом MyInterface.staticMethod (). (EDIT:Since, которые длятся предложение, смутили некоторых людей, называть MyClass.staticMethod () выполняет точно реализацию staticMethod на MyClass, который, если MyClass является интерфейсом, не может существовать!) При вызове их путем определения класса с реализацией MyImplementor.staticMethod () тогда необходимо знать фактический класс, таким образом, это не важно, содержит ли интерфейс его или нет.

, Что еще более важно, статические методы никогда не переопределяются, и при попытке сделать:

MyInterface var = new MyImplementingClass();
var.staticMethod();

в правилах для помех говорится, что метод, определенный в заявленном типе var, должен быть выполнен. Так как это - интерфейс, это невозможно.

можно, конечно, всегда удалять статическое ключевое слово из метода. Все будет хорошо работать. Вам, вероятно, придется подавить некоторые предупреждения, если это называют от метода экземпляра.

Для ответа на некоторые комментарии ниже причина Вы не можете выполниться "result=MyInterface.staticMethod ()", то, что она должна была бы выполнить версию метода, определенного в MyInterface. Но не может быть версии, определенной в MyInterface, потому что это - интерфейс. Это не имеет кода по определению.

8
задан DxCK 12 December 2009 в 12:05
поделиться

3 ответа

Предположительно, вы делаете это более чем в одном месте. Если да, то почему бы вам не сделать это:

{
    DoSomeInputOutput();
}
catch (Exception ex)
{
    HandleInputException(ex);
}

void HandleInputException(Exception ex)
{
   if (ex is InvalidOperationException || ex is InvalidDataException || ex is ArgumentNullException)
   {
     HandleKnownException1 (ex);
   }
   else if ...
   else if ...
}
7
ответ дан 5 December 2019 в 12:59
поделиться

Нет (или, по крайней мере: нет, если исключения, которые вы хотите сгруппировать , случатся , чтобы разделять общий базовый класс, специфичный для этой группы, которого нет в вашей пример); единственное, что вы можете сделать в этом сценарии, - это catch (Exception ex) и провести тестирование во время выполнения на ex . К тому времени, как вы это сделаете, я ожидаю, что ваш код уже будет «красивее» как есть (поскольку, что важно, вы уже преобразовали код обработки в метод).

У меня возникнет соблазн подправить интервал, чтобы я мог сосредоточиться на важном коде:

try
{
    DoSomeInputOutput();
}
// blah humorous scenario 1
catch (InvalidOperationException ex) { HandleKnownException1(ex); }
catch (InvalidDataException ex) { HandleKnownException1(ex); }
catch (ArgumentNullException ex) { HandleKnownException1(ex); }
// blah whimsical scenario 2
catch (ArgumentOutOfRangeException ex) { HandleKnownException2(ex); }
catch (ArithmeticException ex) { HandleKnownException2(ex); }
catch (InvalidCastException ex) { HandleKnownException2(ex); }
// unexpected comedy
catch (Exception ex) { HandleUnknownException(ex); }

(или что-то в этом роде).

В некотором смысле это также связано с этим вопросом: идея переключения / сопоставления с образцом .

5
ответ дан 5 December 2019 в 12:59
поделиться

Вы могли бы сделать что-то подобное, только если бы у вас была приличная иерархия исключений, тогда вы могли бы поймать исключение типа выше в иерархия. Однако иерархии исключений должны быть довольно мелкими по дизайну, и нет гарантии, что вы захотите обрабатывать исключения таким же образом, основываясь исключительно на иерархии. И кроме того ... ничто из этого не поможет со стандартными типами исключений, используемыми в вашем примере.

1
ответ дан 5 December 2019 в 12:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: