2016-10-07 2 views
0

У меня есть класс singleton в моем коде.
В моей основной функции я создал объект этого класса.
Затем я попытался создать клон для этого объекта.
И он дал мне «StackOverflowException».Как мы можем создать объект клонирования экземпляра Singleton?

Мой код выглядит следующим образом:

namespace SingletonApplication 
{ 
    class A : ICloneable 
    { 
     private static readonly A A1 = new A(); 

     public A A2 { get { return A1; } } 
     public object Clone() 
     { 
      var obj = ((ICloneable)A1).Clone(); 
      return obj; 
     } 
    } 


    class Program 
    { 
     static void Main(string[] args) 
     { 
      A obj1 = new A(); 
      A obj2 = (A)(obj1.Clone()); 

      Console.WriteLine(object.ReferenceEquals(obj1.A2, obj2.A2)); 

      Console.ReadKey(); 
     } 

    } 
} 

Ошибка: enter image description here

+2

Это не одиночный код –

+1

Скопируйте ваш код и сообщение об ошибке в свой вопрос здесь. –

ответ

1

ТРЕБОВАНИЕ противоречивых из них:

  • Singleton может иметь самый один экземпляр по его собственному определению
  • Clone() метод должен произвести клон, новый (== второй) пример

Вероятно, лучшим решением является возврат квоты (т. само по себе)

// sealed: do not inherit from me (I'm a Singleton) and create a second instance 
    sealed class A : ICloneable 
    { 
     private static readonly A A1 = new A(); 

     //private constructor: do not create instances (I'm a Sinleton) 
     private A() {} 

     public A A2 { get { return A1; } } 

     // We can't create a new clone but can return an existing instance 
     public object Clone() 
     { 
      // Cloned Singleton? Let it be itself 
      return this; 
     } 
    } 
2

Singleton, по определению, предназначается, чтобы быть класс только один экземпляр через все приложение.

StackOverflowException Вы получаете вызвано Clone menthod, который продолжает называть себя.

0

Вместо рекурсивного вызова Clone на одном и том же объекте снова и снова, вы должны на самом деле сделать что-то, чтобы клонировать этот объект.

Обычно вы создаете новый экземпляр и копируете все соответствующие свойства. Пример:

A newA = new A(); 
newA.X = this.X; 

return newA; 

Однако копировать нечего в коде. Поле readonly останется таким, каким оно есть. Интересно, почему вам нужна копия сингла, поскольку это поражает цель шаблона проектирования. И, кстати, вы используете синглтон совершенно уникально. Я советую прочитать синглтоны и проследить некоторые образцы там.

+0

Следуя одному из ответов stackoverflow [http://stackoverflow.com/a/12367609] ..... В соответствии с шаблоном проектирования он никогда не предназначен – Ajay

0

Ошибка вызвана тем, что вы позволили самому клонировать. приводя к бесконечной петле И это не синглтон. Одноплодный должен выглядеть следующим образом

class A 
    { 
     private static A instance; 

     private A() { } 

     public static A Instance 
     { 
      get 
      { 
       if (instance == null) 
       { 
        instance = new A(); 
       } 
       return instance; 
      } 
     } 
    } 
Смежные вопросы