![](/img/trans.png)
[英]Is it possible to override the nested class definition of an abstract parent, within an inheriting class?
[英]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.