Предположим, у меня есть программа, которая извлекает данные об авиакомпании.В данных каждой авиакомпании используется своя система, из которой мне нужно получить данные (xml).Из-за различий в каждой системе, в основном в xml, и, возможно, в некоторых свойствах, я решил реализовать интерфейс для каждой системы авиакомпаний.Однако я обнаружил, что каждая авиакомпания, хотя и отличается во многих аспектах, также имеет много общего, поэтому, если я сначала сделаю это интерфейсным способом, мне, возможно, придется сделать что-то вроде этого:
public interface IAirlineSystem {
public void PullData();
}
Теперь дляВ каждой системе авиакомпаний (я придумываю эти названия) я мог бы сделать что-то вроде:
public class Oberon : IAirlineSystem {
string Name {get;set;}
int Code {get;set;}
public void Initialize()
{
//initialize code here
}
public void PullData()
{
//code here
}
}
Выше приведена только одна система авиакомпаний, но представьте, что у меня есть больше (например, +10), другая может быть:
public class AirSys: IAirlineSystem {
string Name {get;set;}
int Code {get;set;}
public void Initialize()
{
//initialize code here
}
public void PullData()
{
//code here
}
}
В приведенном выше коде:
Свойства имени и кода уникальны для каждой системы авиакомпании.Initialize содержит одинаковый код для каждой реализации, а PullData уникален для каждой системы.Из-за дубликатов в классах, здесь я мог бы использовать абстрактный класс для хранения кода метода Initialize.Я слышал, что это хорошая практика - на самом деле смешивать интерфейсы и абстрактные классы, что будет примером для этого на примере моей системы авиакомпаний?
Еще одна вещь, которая возникает, - это предположить, что у меня есть другой метод винтерфейс называется ValidateData, но не все системы авиакомпаний должны вызывать его, но если я добавлю его в интерфейс, мне потребуется реализовать пустой метод, если он не нужен.Есть ли способ, которым я могу предотвратить необходимость сделать это.Является ли это еще одной причиной для использования абстрактного класса, возможно, с виртуальным методом, чтобы он мог быть переопределен при необходимости.Если бы я сделал ValidateData абстрактным методом, его все равно нужно было бы реализовать, верно?