none
Как реализовать метод Clone интерфейса Icloneable? RRS feed

Ответы

  • Так кто сказал, что это будет работать, так просто компилироваться будет. А если Вам нужно реализовать его, то:

    namespace CloneObject
    {
      class Program
      {
        static void Main(string[] args)
        {
          MyClass obj1 = new MyClass("Объект 1");
          MyClass obj2 = (MyClass)obj1.Clone();
          //Тут создаётся копия.
          obj2.MyString = "Объект 2";
          Console.WriteLine("obj {0}", obj1.MyString);
          //Тут убеждаемся в этом.
          Console.WriteLine("obj {0}", obj2.MyString);
        }
        public class MyClass : ICloneable
        {
          private string myString;
          public string MyString
          {
            get { return myString; }
            set { myString = value; }
          }
          public MyClass(string myString)
          {
            this.myString = myString;
          }
          //Неглубокое крпирование, дальше некуда, 
          //поскольку базовый тип у нас Object.
          public object Clone()
          {
            return this.MemberwiseClone();
          }
        }
      }
    }

    "Это наверное потому, что возвращаемый объект не приведён к типу возвращаемого значения в объявлении метода." - в объявлении метода делать такое нельзя, так как сигнатура метода интерфейса и реализуемого класса должна быть одинаковой, а вот override убрать нужно, я вроде раньше и сам его не заметил.

    • Предложено в качестве ответа Abolmasov Dmitry 10 сентября 2012 г. 13:51
    • Помечено в качестве ответа YatajgaEditor 10 сентября 2012 г. 19:39
    9 сентября 2012 г. 11:35
    Модератор
  • Рабочий код:

        class Class1 : ICloneable
        {
            public object Clone()
            {
                Class1 MyClass1 = new Class1();
                return MyClass1;
            }
        }

    Но в следующей книге написан код с использованием "override":

    Автор: Фленов

    Книга: Библия C#

    Подозрительный код:

    • Помечено в качестве ответа Ziya Ceferov 10 сентября 2012 г. 15:54
    10 сентября 2012 г. 15:54

Все ответы

  • ну ту как минимум не написан тип возвращаемого значения в описании метода,
    там вроде раньше был object

    привести к типу object тогда (скобками например) и вернётся.
    конечно всё равно будет не правильно, так как вы возвращаете только что созданный объект вместо копии,
    но его наверное как-то можно копией сделать.

    Помнится было что-то вроде this.MembersWiseClone() для поверхностного копирования.

    7 сентября 2012 г. 10:18
  • Тема не совсем тривиальная на самом деле, так как типы входят в иерархию, и здесь встаёт понятие "уровней вложенности". Т.е. насколько глубоко копирование пойдёт вверх по иерархии. Чтобы понят, нужно чётко представлять, что такое ссылки, значения и как всё это работает. Про копирование, читайте тут. А что касается ошибки, то как отмечено высше, нужно указать возвращаемый тип - object.
    7 сентября 2012 г. 11:43
    Модератор
  • там вроде раньше был object

    привести к типу object тогда (скобками например) и вернётся.

    Сделал, но не сработало:

        class Class1 : ICloneable
        {
            public override Clone()
            {
                Class1 MyClass1 = new Class1();
                return (Object)MyClass1;
            }
        }

    Помнится было что-то вроде this.MembersWiseClone() для поверхностного копирования.

    Про это я знаю, просто шась изучаю данный метод.


    7 сентября 2012 г. 13:26
  • Так Вам нужно написать:

    public override object Clone()
    {
      Class1 MyClass1 = new Class1();
      return MyClass1;
    }

    т.е. указать возвращаемый тип, как написал высше.

    7 сентября 2012 г. 13:33
    Модератор
  • Видимо не дошёл ответ, ошибки на форумах. Как указал высше: "А что касается ошибки, то как отмечено высше, нужно указать возвращаемый тип - object."

    class Class1 : ICloneable
        {
            public override object Clone()
            {
                Class1 MyClass1 = new Class1();
                return MyClass1;
            }
        }

    7 сентября 2012 г. 14:27
    Модератор
  • О, а теперь дублируется...Сегодня форум глючит снова.
    7 сентября 2012 г. 14:28
    Модератор
  • Так Вам нужно написать

    Не сработало:

        class Class1 : ICloneable
        {
            public override object Clone()
            {
                Class1 MyClass1 = new Class1();
                return MyClass1;
            }
        }
    8 сентября 2012 г. 11:18
  • Это наверное потому, что возвращаемый объект не приведён к типу возвращаемого значения в объявлении метода.
    Попробуйте сделать как я сказал ранее, скобками привести тип.
    8 сентября 2012 г. 21:16
  • Попробуйте сделать как я сказал ранее, скобками привести тип.

    Не сработало:

        class Class1 : ICloneable
        {
            public override object Clone()
            {
                Class1 MyClass1 = new Class1();
                return (object)MyClass1;
            }
        }
    9 сентября 2012 г. 7:50
  • Это потому что ICloneable не класс а интерфейс.
    И не нужно перегружать.
    Его нужно реализовывать.

    оверриде слово сотрите.



    • Изменено INFEL8 9 сентября 2012 г. 11:11
    9 сентября 2012 г. 11:10
  • Так кто сказал, что это будет работать, так просто компилироваться будет. А если Вам нужно реализовать его, то:

    namespace CloneObject
    {
      class Program
      {
        static void Main(string[] args)
        {
          MyClass obj1 = new MyClass("Объект 1");
          MyClass obj2 = (MyClass)obj1.Clone();
          //Тут создаётся копия.
          obj2.MyString = "Объект 2";
          Console.WriteLine("obj {0}", obj1.MyString);
          //Тут убеждаемся в этом.
          Console.WriteLine("obj {0}", obj2.MyString);
        }
        public class MyClass : ICloneable
        {
          private string myString;
          public string MyString
          {
            get { return myString; }
            set { myString = value; }
          }
          public MyClass(string myString)
          {
            this.myString = myString;
          }
          //Неглубокое крпирование, дальше некуда, 
          //поскольку базовый тип у нас Object.
          public object Clone()
          {
            return this.MemberwiseClone();
          }
        }
      }
    }

    "Это наверное потому, что возвращаемый объект не приведён к типу возвращаемого значения в объявлении метода." - в объявлении метода делать такое нельзя, так как сигнатура метода интерфейса и реализуемого класса должна быть одинаковой, а вот override убрать нужно, я вроде раньше и сам его не заметил.

    • Предложено в качестве ответа Abolmasov Dmitry 10 сентября 2012 г. 13:51
    • Помечено в качестве ответа YatajgaEditor 10 сентября 2012 г. 19:39
    9 сентября 2012 г. 11:35
    Модератор
  • Привет.

    Все очень просто, поставьте курсор на ICloneable и нажмите Alt-Shift-F10, у вас будет предложено реализовать этот интерфейс и автоматически будет создана функция, для которой останется написать реализацию:

        public class myca : ICloneable
        {
            public object Clone()
            {
                // реализация
                throw new NotImplementedException();
            }
        }


    Для связи [mail]

    10 сентября 2012 г. 13:51
  • Рабочий код:

        class Class1 : ICloneable
        {
            public object Clone()
            {
                Class1 MyClass1 = new Class1();
                return MyClass1;
            }
        }

    Но в следующей книге написан код с использованием "override":

    Автор: Фленов

    Книга: Библия C#

    Подозрительный код:

    • Помечено в качестве ответа Ziya Ceferov 10 сентября 2012 г. 15:54
    10 сентября 2012 г. 15:54
  • Там опечатка скорее всего.
    10 сентября 2012 г. 16:09
    Модератор
  • public object Clone()

    {

    return new Class1() as object;

    }

    14 марта 2016 г. 6:20