簡體   English   中英

具有覆蓋的嵌套抽象類

[英]Nested Abstract Class with Override

我有一個抽象類,用於存儲有關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返回中的元數據而改變。

所以我的問題是,我的摘要中是否可以有一個空類,該空類在抽象構造函數中實例化以減少重復,但是是否可以使用派生類中存在的屬性呢?

如果沒有,做這樣的最好的方法是什么?

使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基類。

這樣的事情怎么樣(我不知道個人檔案的類型。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 { }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM