Я пытаюсь выбрать наилучший способ структурирования некоторого кода. Я признаю, что это может быть за бортом и превращается в нечто более академическое, чем практическое. Иногда вы просто не можете помочь себе.
Позвольте мне придумать простой пример:
Предположим, у вас есть классы / интерфейсы, такие как:
interface IProcessedPhoto { }
interface IPhotoProcessor
{
IProcessedPhoto Process(byte[] bytes);
void Alter(IProcessedPhoto processedPhoto);
}
class PhotoProcessedWithAMethod : IProcessedPhoto { }
class PhotoProcessedWithBMethod : IProcessedPhoto { }
class AProcessor : IPhotoProcessor
{
IProcessedPhoto Process(byte[] bytes); // Returns PhotoProcessedWithAMethod
void Alter(IProcessedPhoto processedPhoto)
{
var casted = processedPhoto as PhotoProcessedWithAMethod;
// a "B" would crash here.
}
}
class BProcessor : IPhotoProcessor
{
IProcessedPhoto Process(byte[] bytes); // Returns PhotoProcessedWithBMethod
void Alter(IProcessedPhoto processedPhoto)
{
var casted = processedPhoto as PhotoProcessedWithBMethod;
// an "A" would crash here.
}
}
class Algorithm
{
void DoStuff()
{
var processor = ProcessorFactory.CreateProcessor(//stuff);
var processedPhoto = processor.ProcessPhoto(new byte[100]);
processor.Alter(processedPhoto);
}
}
Итак, в основном я хочу, чтобы метод DoStuff () создал один тип процессора изображений и вызвал соответствующий метод Process. Однако, несмотря на то, что предлагает интерфейс, Process работает только с IProcessedPhoto соответствующего типа (фотографии A и B НЕ взаимозаменяемы, они просто имеют похожие имена методов). Мой настоящий код более сложен в том смысле, что каждый процессор имеет несколько классов, специфичных для них и не взаимозаменяемых, но я хочу выполнить тот же набор «логических» операций, как метод шаблона.
var artifactA = processor.DoA();
var artifactB = processor.DoB();
var final = processor.Process(artifactA, artifactB);
Надеюсь, это объясняет.