带覆盖的嵌套抽象类

时间:2014-06-25 21:39:15

标签: c# inheritance design-patterns abstract-class abstraction

我有一个抽象类,用于存储有关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在抽象类中实现,并且在我们到达派生类之前,类中实现的属性不存在,所以{派生类中的{1}}对象没有属性。

但我的问题是,每个派生类的类名和实例化都是相同的,它只是根据JSON返回中的元数据而改变的属性。

所以我的问题是,我的抽象中是否有一个空类可以在抽象构造函数中实例化以减少重复,但是使用派生类中存在的属性呢?

如果没有,做这样的事情的最佳方式是什么?

2 个答案:

答案 0 :(得分: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基类。

答案 1 :(得分:0)

这样的事情怎么样(我不知道profile.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 { }
}