Просто чтобы прояснить ситуацию ...
Интерфейс не может иметь полей.
Однако он может иметь свойства. Свойства, которые неизменно должны быть реализованы через код объектами, которые реализуют интерфейс.
Если вы не планируете приводить ссылку на объект через интерфейс обратно к конкретному типу, вы должны поместить некоторые свойства, которые имеют смысл в интерфейс, иначе вы не сможете их достичь.
Другими словами, если у вас есть это:
IVehicle vehicle = GetVehicle();
// want to get speed of vehicle?
Car car = (Car)vehicle;
Double speed = car.Speed;
Общие свойства должны быть помещены в общий интерфейс. Поскольку транспортное средство является движущимся объектом, скорость имеет смысл иметь там.
Однако число двигателей будет иметь смысл для самолетов и некоторых лодок, но не для автомобилей, и такой тип информации, вероятно, придется размещать в некоторых более конкретных интерфейсах.
Статика будет означать разделение между экземплярами, я сомневаюсь, что это было бы хорошей идеей.
Однако общий план использования интерфейсов вместо простой иерархии классов для отделения доступа к объекту и его использования от его фактического типа и идентичности является хорошей идеей и приводит к хорошему дизайну.
Лучший план - выбрать уровень абстракции, который имеет смысл для вашей модели, и согласиться с этим. Вы можете очень легко перепроектировать такое решение. Например, вы могли бы понять, что некоторые транспортные средства вообще не имеют двигателей, а некоторые могут двигаться более чем в одном измерении (то есть не только вперед / назад, но вверх / вниз, в стороны и т. Д.) И выбирать уровень это подходит вашей модели, это хорошее начало.
Например, если вы собираетесь моделировать транспортные проблемы, с которыми сталкивается графство, может ли самолет двигаться только вперед / назад или у него есть вертикальные вращающиеся двигатели или нет, так что вы, вероятно, не должны пытаться спроектируйте это в решение.