gpt4 book ai didi

c# - 如何用单例做继承

转载 作者:行者123 更新时间:2023-11-30 21:03:20 24 4
gpt4 key购买 nike

我想知道如何从具有单例的“BaseClient”类继承,并能够在继承类中使用来自基类单例的基本成员的相同实例。

public class BaseClient
{
protected string _url;
protected string _username;
protected string _password;

private static BaseClient _instance;
private static readonly object padlock = new object();

public static BaseClient Instance
{
get
{
lock (padlock)
{
if (_instance == null)
{
_instance = new BaseClient(true);
}
return _instance;
}
}
}

public void SetInfo(string url, string username, string password)
{
_url = url;
_username = username;
_password = password;
}

public string GetVersion()
{
//MyService is a simple static service provider
return MyService.GetVersion(_url, _username, _password);
}
}

public class Advanced : BaseClient
{
private static AdvancedClient _instance;
private static readonly object padlock = new object();

public static AdvancedClient Instance
{
get
{
lock (padlock)
{
if (_instance == null)
{
_instance = new AdvancedClient(true);
}
return _instance;
}
}
}

public void DoAdvancedMethod()
{
MyService.DoSomething(_url, _username, _password);
}
}

所以如果我使用 BaseClient.Instance.SetInfo("http://myUrl", "myUser", "myPassword");然后 AdvancedClient.Instance.DoAdvancedMethod(),AdvancedClient 单例将使用与 BaseClient 单例相同的基本成员实例?

最佳答案

我一直发现使用泛型来实现这种类型的解决方案要容易得多:

public class Singleton<T> where T : class
{

protected Singleton()
{
}

public static T Instance
{
get { return SingletonFactory.instance; }
}

public void SetInfo(string url, string username, string password)
{
...
}

public string GetVersion()
{
...
}

class SingletonFactory
{

internal static readonly T instance;

static SingletonFactory()
{
ConstructorInfo constructor = typeof(T).GetConstructor(
BindingFlags.Instance | BindingFlags.NonPublic,
null, new System.Type[0],
new ParameterModifier[0]);

if (constructor == null)
throw new Exception(
"Target type is missing private or protected no-args constructor: type=" +
typeof(T).FullName);
try
{
instance = constructor.Invoke(new object[0]) as T;
}
catch (Exception e)
{
throw new Exception(
"Failed to create target: type=" + typeof(T).FullName, e);
}
}

}

}

public class Advanced : Singleton<Advanced>
{
...
}

关于c# - 如何用单例做继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12962499/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com