如何在子类中实现单例模式

时间:2016-10-12 04:53:29

标签: c# asp.net singleton

我在visual studio 2010中练习.net。我正在申请子类型的银行帐户和AccountState子类型,即:Bronze StateGold State,{{1} },Silver State。每种帐户类型的上限和下限不同。

Platinum State

如何为所有帐户状态设置AutoImplemented属性的上限和下限并牢记Singleton?

4 个答案:

答案 0 :(得分:0)

您的代码已被删除,因此我假设您的GetInstance方法是这样的......

public static BronzeState GetInstance()
{
     if (bronzeState != null)
          return bronzeState;
     else
     {
          bronzeState = new BronzeState();
          return bronzeState; 
     }
}

要使用它,你应该能够做到这一点。

BronzeState.GetInstance().upperlimit = //...The value for the upperlimit.

发布您尝试过的不起作用的内容。

答案 1 :(得分:0)

您的单例实现是正确的。既然你已经拥有它,那么其余部分就像常规继承一样。请记住,您可以使用“this”运算符引用继承的方法,属性和字段。

紧跟现有代码,要设置子类中继承属性的值,您需要,例如:

this.upperlimit = 5000;

那么问题是你应该在子类中设置限制。构造函数可能是确保在使用前设置上限的可能位置。这看起来像是:

private BronzeState()
{
    this.upperlimit = 5000;
}

我要注意的一件事是,虽然它没有直接回答问题,但您应该考虑您希望谁能够更改AccountState的限制。现在,您可以通过任何其他类看到并设置的限制。看起来你只希望它们可以被子类改变。

为此,您需要使用受保护的setter,如下所示:

public double upperlimit { get; protected set; }

确保任何人都可以看到该值,但只能由父类或子类设置。

全貌将是:

public class AccountState
{
    public double UpperLimit { get; protected set; }
    public double LowerLimit { get; protected set; }
}

public class BronzeState : AccountState
{
    private BronzeState()
    {
        this.UpperLimit = 5000;
        this.LowerLimit = 1000;
    }

    public static BronzeState GetInstance()
    {
        ...
    }
}

在不了解您的场景细节的情况下,我还会考虑在此场景中使用抽象属性。例如:

public abstract class AccountState
{
    public abstract double UpperLimit { get; }
    public abstract double LowerLimit { get; }
}

public class BronzeState : AccountState
{
    public override double UpperLimit
    {
        get { return 5000; }
    }

    public override double LowerLimit
    {
        get { return 1000; }
    }

    public static BronzeState GetInstance()
    {
        ...
    }
}

这种设计的优点是可以强制子类定义上限和下限,并鼓励他们不要改变,如果需要的话。选择哪种设计更好将取决于适合的更广泛的情况。

在上述任何一个示例中,要从类之外的访问值,看起来像:

double limit = BronzeState.GetInstance().UpperLimit;

您可以在C#中阅读有关继承的更多信息(包括我上面提到的内容)on MSDN

答案 2 :(得分:0)

评论不允许我插入代码,所以我要添加另一个答案。这只是为了展示我如何创建一个Singleton对象。其他人可能有更好或不同的方式,但这是有效的。 要正确管理单例,您必须只有该类的一个实例。你可以使类静态但在某些情况下这不会。为了防止另一个类实例化它,你必须只使用'private'构造函数。您还必须创建并保存自己的静态引用作为单例对象中的字段,最后公开一个返回该字段的静态方法。如果你想要超级带走,你可以引入更多的逻辑来防止反复复制这个对象,但这超过了顶级的IMO。

  1. 私人构造函数
  2. 私有静态实例
  3. 返回实例的公共静态方法
  4. public class MySingleton
    {
        private static MySingleton instance = new MySingleton();
        private MySingleton() { }
        public static MySingleton Instance => instance;
    }
    

    出于某种原因,它不会让我把这个例子放在代码块中......保持给我一个错误,所以我把它放在Quote中。

    此时,您可以将所需的任何数据和属性放在对象中,并根据需要在构造函数中初始化它们。将它们公开为普通的类属性,而不是静态的,所有其他类都必须要做的是

    MySingleton.Instance.SomeProperty
    

答案 3 :(得分:0)

在.NET中,您不像其他框架或语言那样经常使用单例。你拥有的是有限数量,而不是单身。您有3种类型的帐户状态。如果你坚持使用.NET实践,你可以这样实现它:

Code=B

然后您可以像这样使用它:

public class AccountState
{
    private AccountState(double upper, double lower)
    {
       this.UpperLimit = upper;
       this.LowerLimit = lower;
    }

    public double UpperLimit { get; }

    public double LowerLimit { get; }

    public static AccountState Bronze { get; } = new AccountState(10, 0);

    public static AccountState Silver { get; } = new AccountState(20, 11);

    public static AccountState Gold { get; } = new AccountState(25, 21);
}