2014-06-25 142 views
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

使抽象類具有通用性嗎? – clcto

+0

@WiktorZychla在salesforces案例中,我有一些數據訪問方法需要像'instance_url'這樣的信息來進行REST API調用,所以我將在SalesforceProvider中有一個公共方法,該方法中的'instance_url'獲得一個專用引用。 – Wesley

回答

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

什麼像這樣(我不知道是什麼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 { } 
} 
+0

profile.JsonMeta是一個字符串,它是OAuth令牌響應的原始JSON輸出。 – Wesley

+0

so ... private readonly string _jsonMeta; –

+0

您可以只將配置文件數據存儲在基類中,並在子類中有Json調用。如果您不想每次反序列化,請在基類中創建受保護的JsonMeta,並將其設置爲null。第一次從子類調用ProviderMeta時,可以填充JsonMeta屬性。 –