Вложенный абстрактный класс с переопределением

1

У меня есть абстрактный класс, который я использую для хранения информации о токенах OAuth:

public abstract class Provider
{
    private readonly string _accessToken;
    private readonly string _refreshToken;
    private readonly JsonMeta _providerMeta;

    protected Provider(TokenProfile profile)
    {
        _accessToken = profile.AccessToken;
        _refreshToken = profile.RefreshToken;
        _providerMeta = 
                  JsonConvert.DeserializeObject<JsonMeta>(profile.JsonMeta);
    }
    protected class JsonMeta {}
}

Я использую этот базовый класс для создания подклассов с более конкретными свойствами:

public class SalesforceProvider : Provider
{
    public SalesforceProvider(TokenProfile profile) : base(profile)
    {
    }
    //Get unique information from the Json
    protected new class JsonMeta
    {
        public string instance_url;
        public string token_type;
        public string id_token;
    }
    //Salesforce calls must be made to a specific server associated
    //with the users account. Most OAuth calls contain unique
    //metadata like this in their responses that is needed to
    //use their service
    public string SomeData()
    {
        return Salesforce.Leads(_providerMeta.instance_url);
    }
}

Однако вышеописанное не работает, поскольку JsonMeta реализована в абстрактном классе, а свойства, реализованные в классе, не существуют до тех пор, пока мы не перейдем к производному классу, поэтому объект JsonMeta в производном классе лишен свойств.

Но моя проблема заключается в том, что имя класса и экземпляры будут одинаковыми для каждого производного класса, это просто свойства, которые будут меняться в зависимости от метаданных в возврате JSON.

Итак, мой вопрос: могу ли я иметь пустой класс в своем тезисе, который создается в абстрактном конструкторе, чтобы уменьшить повторение, но делает это со свойствами, присутствующими в производном классе?

Если нет, каков наилучший способ сделать что-то подобное?

  • 1
    Как и когда используется JsonMeta после его инициализации?
  • 0
    Сделать абстрактный класс универсальным?
Показать ещё 3 комментария
Теги:
design-patterns
inheritance
abstract-class
abstraction

2 ответа

2

Сделайте реферат JsonMeta.

public abstract class Provider
{
    private readonly JsonMeta _providerMeta;

    protected Provider(TokenProfile profile, JsonMeta json)
    {
        // do stuff with JsonMeta object
    }

    protected abstract class JsonMeta { }
}

public class SalesforceProvider : Provider
{
    public SalesforceProvider(TokenProfile profile)
        : base(profile, new SalesforceJson())
    { }

    private class SalesforceJson : JsonMeta
    {
        // Salesforce-specific stuff
    }
}

Это позволяет создавать разные реализации JSON для разных типов, но при этом абстрагироваться от использования их базовым классом Provider.

0

Что-то вроде этого (я не знал, какой тип профиля. JsonMeta был.)

public abstract class Provider
{
    private readonly string _accessToken;
    private readonly string _refreshToken;
    private readonly object _jsonMeta;

    protected Provider(TokenProfile profile)
    {
        _accessToken = profile.AccessToken;
        _refreshToken = profile.RefreshToken;
        _jsonMeta = profile.JsonMeta;
    }
    protected JsonMeta ProviderMeta
    {
        get
        {
            return JsonConvert.DeserializeObject<JsonMeta>(_jsonMeta); ;
        }
    }
    protected class JsonMeta { }
}
  • 0
    profile.JsonMeta - это строка, являющаяся необработанным выводом JSON ответа токена OAuth.
  • 0
    так что ... приватная только для чтения строка _jsonMeta;
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню