Скажем, у меня есть следующие классы:
public abstract class A
{
protected abstract ReturnA Foo();
public void UseFoo()
{
var foo = Foo();
if (foo != null)
{
//logic here
}
}
}
public class B : A
{
protected override ReturnA Foo()
{
// Implementation specific code that returns ReturnB instead.
}
}
public class C : A
{
protected override ReturnA Foo()
{
// Implementation specific code that returns ReturnC instead.
}
}
public class ReturnA
{
public int Id { get; set; }
public string Address { get; set; }
}
public class ReturnB
{
public string Id { get; set; }
public string PhoneNumber { get; set; }
}
public class ReturnC
{
public Guid Id { get; set; }
public string Name { get; set; }
}
Я знаю, что C# не поддерживает производные типы возвращаемых данных, но это тоже не то, что мне нужно. Классы B и C являются спецификациями реализации c, и поэтому их типы возвращаемых данных не имеют ничего общего с каждым другим.
Причина, по которой я хотел бы обработать это, заключается в том, что метод UseFoo в классе A может иметь некоторые generi c проверки и другие generi c logi c, которые не имеют никакого отношения к самому возвращаемому объекту. Поэтому я хочу «передать на аутсорсинг» только тот код, который является спецификацией реализации c и не должен вместо этого делать абстракцию UseFoo, и чтобы каждая реализация писала один и тот же универсальный код c.
Есть ли способ решить это вообще?
РЕДАКТИРОВАТЬ: ни ReturnC
, ни ReturnB
не являются производными от ReturnA
. Обновлено с примерами.