Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 单态遗传_Design Patterns_Singleton - Fatal编程技术网

Design patterns 单态遗传

Design patterns 单态遗传,design-patterns,singleton,Design Patterns,Singleton,如何从单例类继承到需要相同功能的其他类中? 像这样的事情有什么意义吗?有人可以随意纠正我,但按照我的理解,有一次我犯了一个错误: public class BaseClass { protected static List<string> ListOfSomething { get; set; } } public class ChildClass { protected static List<int> ListOfSomethingElse { get; s

如何从单例类继承到需要相同功能的其他类中?
像这样的事情有什么意义吗?

有人可以随意纠正我,但按照我的理解,有一次我犯了一个错误:

public class BaseClass
{
  protected static List<string> ListOfSomething { get; set; }
}

public class ChildClass
{
  protected static List<int> ListOfSomethingElse { get; set; }
}

public class AnotherChildClass
{
  protected static List<int> ListOfSomethingElse { get; set; }
}
公共类基类
{
受保护的静态列表内容{get;set;}
}
公营儿童班
{
受保护的somethingelse{get;set;}的静态列表列表
}
公共类另一个儿童类
{
受保护的somethingelse{get;set;}的静态列表列表
}
两个子类将共享相同的
列表
,它们不会有自己的副本。所有孩子将共享相同的静态文件。这是单胎行为和遗传的蜕皮。正如silky所说……你不应该这么做,你可能会遇到类似的事情

如果你不是在谈论这样的事情……我不确定你说的是什么单身汉,举个例子会很有帮助,因为单身汉有很多利基用途。

Jon Skeet不久前。虽然使用嵌套的内部类确实有一点不尽如人意,但使用单例继承可以获得一些好处。它没有无限的可扩展性,它只是一种让单例在运行时选择自己实现的技术


实际上,从单例继承并没有多大意义,因为单例模式的一部分是实例管理,一旦您已经有了一个基类型的物理实例,那么在派生类型中重写这一切就太晚了。即使可以,我怀疑这可能会导致设计难以理解,甚至更难测试/维护。

您可以从singleton继承,并使用模板(C++)或泛型(C#.NET)进行“重用”或某些微调

我在我的博客()中发布了一系列关于这个主题的帖子:

1) 在C#NET中

2) C#.NET中的线程安全单例继承

3) C语言中的几种单例实现++

我们邀请您访问这些链接,并与所有人分享您的意见。
祝你好运。

有几种解决方案使用内部类和反射(其中一些在其他答案中提到)。然而,我相信所有这些解决方案都涉及客户机和派生类之间的紧密耦合

这是一种允许客户机只依赖于基类的方法,并且是开放的扩展

基类与通常的实现类似,只是我们将其定义为一个抽象类(如果实例化基类是合法的,那么您也可以像定义常规单例一样定义它)

任何子类型都有自己的instance方法(不能重写静态方法)。例如:

public class Dog extends Animal{
    protected Dog(){}

    public static Animal theInstance(){
        if (instance == null){
            instance = new Dog();
        }
        return instance;
    }

    @Override
    void speak() {
        System.out.println("Wouf");
    }
}
在主类中,您将编写
Dog.theInstance()
,任何后续客户端都将调用
Animal.theInstance()
。这样,客户机可以完全独立于派生类,并且您可以添加新的子类,而无需重新编译客户机(开-闭原则)

public class Dog extends Animal{
    protected Dog(){}

    public static Animal theInstance(){
        if (instance == null){
            instance = new Dog();
        }
        return instance;
    }

    @Override
    void speak() {
        System.out.println("Wouf");
    }
}