Как переопределить метод, чтобы он создавал и возвращал копию объекта, из которого вызывается?

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

class Base
{
    public string txt;

    public virtual Derivative CreateObject()
    {
        Derivative obj = new Derivative();

        return obj;
    }
}

class Derivative : Base
{
    public char symb;

    public override Derivative CreateObject()
    {
        Derivative obj = new Derivative();

        return obj;
    }
}
  • Вопрос задан
  • 125 просмотров
Решения вопроса 1
Casper-SC
@Casper-SC
Программист (.NET)
Как-то так это делается.

Кстати, в производном классе вместо
public override Base CreateCopy()
можно указать
public override Derivative CreateCopy()
и это будет работать. Насколько помню, это нововведение новой версии C#. Вот в справке написано, что версии C# 9.

using System;

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            var objectBase = new Base("Base");
            var objectDerivative = new Derivative("Derivative", '7');

            var copyBase = objectBase.CreateCopy();
            var copyDerivative = objectDerivative.CreateCopy();

            Console.WriteLine(copyBase);
            Console.WriteLine(copyDerivative);
        }
    }

    public class Base
    {
        private readonly string _text;

        public string Text
        {
            get { return _text; }
        }

        public Base(string text)
        {
            _text = text;
        }

        public virtual Base CreateCopy()
        {
            return new Base(Text);
        }

        public override string ToString()
        {
            return $"{nameof(Text)}: {Text}";
        }
    }

    public class Derivative : Base
    {
        private readonly char _symbol;

        public char Symbol
        {
            get { return _symbol; }
        }

        public Derivative(string text, char symbol)
            : base(text)
        {
            _symbol = symbol;
        }

        public override Base CreateCopy()
        {
            return new Derivative(Text, Symbol);
        }

        public override string ToString()
        {
            return $"{nameof(Text)}: {Text}, {nameof(Symbol)}: {Symbol}";
        }
    }
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы