具有覆盖的嵌套抽象类
本文关键字:嵌套 抽象类 覆盖 | 更新日期: 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 { }
}