Один из вариантов, если вы не хотите иметь множество интерфейсов, это иметь реализацию по умолчанию для вашего абстрактного базового класса:
public abstract class LookupBase
{
public virtual bool getId()
{
throw new NotImplementedException();
}
public virtual bool getName();
{
throw new NotImplementedException();
}
public virtual bool getDescription();
{
throw new NotImplementedException();
}
}
И в ваших конкретных реализациях переопределяет только то, что вам нужно:
public class LookupA: LookupBase
{
public override bool getId()
{
//do some work
}
}
Если вы выбросите исключения, как в моем примере, во время выполнения будет очевидно, что что-то не реализовано.Однако это произойдет только во время выполнения, а не во время компиляции.Как отметил @Bagus Tesa, этот подход потребует много дисциплины и документации, чтобы знать, что происходит в каждом конкретном случае.Другой немного более безопасный с точки зрения исполнения и немного более опасный подход - иметь реализацию по умолчанию, которая ничего не будет делать / возвращать объект этих методов по умолчанию.Это не разрушит ваше приложение во время выполнения, но приведет к потенциальным логическим ошибкам.