Идея интерфейсов в том, что вам не нужно знать, какой это. Вы должны просто иметь возможность передавать IMech и вызывать его функциональность независимо от реализации. Учтите следующее:
public interface IMech {
void sendMessage();
}
public class Email implements IMech {
@Override
void sendMessage() { /* stuff here to send email */ }
}
Это типичная схема использования интерфейса. Если вы используете его только для опции, возможно, вам следует рассмотреть возможность использования перечисления.
enum IMech { EMAIL, INSTANT_MESSAGE, SNAIL_MAIL, YELL_OVER_CUBICLE }
public void sendNotification( IMech mechanism ){
switch(mechanism) {
case IMech.EMAIL: // do email .. etc
}
}
foo.sendNotification(IMech.EMAIL);
Теперь я знаю, что они не отвечают непосредственно на ваши вопросы, но это типичные формы использования и обычно указывают на более адаптируемые шаблоны проектирования. В конце концов, вам действительно нужно отправить объект класса? Перечисление кажется более подходящим, если вы просто определяете, какой механизм использовать.