具有覆盖的嵌套抽象类

本文关键字:嵌套 抽象类 覆盖 | 更新日期: 2023-09-27 18:10:14

我有一个用来存储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返回的元数据改变。

所以我的问题是,我可以在抽象构造函数中实例化一个空类,以减少重复,但这样做与派生类中存在的属性?

如果没有,最好的方法是什么?

具有覆盖的嵌套抽象类

Make JsonMeta abstract.

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基类的使用。

像这样怎么样(我不知道什么类型的配置文件。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 { }
}