Как обрабатывать разные типы возвращаемых данных при переопределении абстрактного метода? - PullRequest
0 голосов
/ 23 марта 2020

Скажем, у меня есть следующие классы:

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. Обновлено с примерами.

...