8 / 5 / 3
Регистрация: 19.09.2019
Сообщений: 88
1

Переопределение метода базового класса в производном

07.11.2019, 05:37. Показов 6317. Ответов 12

В базовом классе Base метод CreateObjMC создаёт объект производного класса, а в производном классе MyClass "этот" метод переопределяется для создания объекта MyClass путём копирования объекта MyClass.

вылетает ошибка Error 1 'MyClass.CreateObjMC(MyClass)': no suitable method found to override
Код:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
using System;
 
class Base
{
    public string text="qwerty";
    //создание объекта производного класса MyClass
    public virtual MyClass CreateObjMC()//Ошибка здесь!
    {
        MyClass obj1 = new MyClass(this.text[1]);
 
        return obj1;
    }
}
 
class MyClass:Base
{
    public char symbol;
 
    public MyClass(char symbol)
    {
        this.symbol = symbol;
    }
    //перегруженные метод базового класса для
    //создания объекта MyClass путём копирования
    public override MyClass CreateObjMC(MyClass obj)
    {
        MyClass obj1 = obj;        
        return obj1;
    }   
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.11.2019, 05:37
Ответы с готовыми решениями:

Вызов метода базового класса игнорируя переопределенный метод в производном классе
Как вызвать метод базового класса игнорируя переопределенный метод в производном классе. PS...

Переопределение метода базового класса
Есть библиотека, в которой находится базовый класс А, который содержит функцию проверки Check. Есть...

Не получается вызвать Change из базового класса в производном
Не получается вызвать Change из базового класса в производном, помогите. using System; using...

Полиморфизм: вызов метода базового класса, переопределенного метода и нового метода
В базовом классе метод помечен как virtual. Насколько я понял из книги: override означает, что...

12
897 / 552 / 274
Регистрация: 26.11.2015
Сообщений: 1,745
Записей в блоге: 2
07.11.2019, 06:33 2
Вы пытаетесь переопределить метод без параметров методом с параметром.
Сигнатура двух методов должна быть одинаковой
1
8 / 5 / 3
Регистрация: 19.09.2019
Сообщений: 88
07.11.2019, 07:44  [ТС] 3
Ошибка возникает в переопределённом методе в производном классе, не туда коммент вставил

Добавлено через 4 минуты
Toros1992, Toros1992, Переопределить метод в производном классе без аргументов, а потом его перегрузить?

Добавлено через 8 минут
Toros1992, Типа так?:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
using System;
 
class Base
{
    public string text="qwerty";
    //создание объекта производного класса MyClass
    public virtual MyClass CreateObjMC()
    {
        return new MyClass(this.text[1]);
    }
}
 
class MyClass:Base
{
    public char symbol;
 
    public MyClass(char symbol)
    {
        this.symbol = symbol;
    }
    //переопределение 
    public override MyClass CreateObjMC()
    {
        return new MyClass(' ');
    }
 
    //перегрузка
    public  MyClass CreateObjMC(MyClass obj)
    {
        MyClass obj1 = obj;        
        return obj1;
    }   
}
 
class Program
{
    static int Main()
    {
        Base obj = new Base();
 
        MyClass obj1 = obj.CreateObjMC();
 
        MyClass obj2 = obj1.CreateObjMC(obj1);
 
       
        
        return 0;
    }
}
0
897 / 552 / 274
Регистрация: 26.11.2015
Сообщений: 1,745
Записей в блоге: 2
07.11.2019, 07:51 4
Ну да, так можно. Но только это бессмысленно.
Так как я не знаю задачу, то не могу подсказать как надо, но на 100% уверен, что не так как у вас.
Суть переопределения - полиморфизм.
Чтобы через ссылку на объект базового класса вызывать методы производных классов.
У вас же ваш перегруженный метод будет существовать только в одном классе наследнике. Тогда переопределение вообще не нужно.

И то, что у вас базовый класс что-то знает о наследнике - это очень плохо

Добавлено через 1 минуту
И кстати, что по вашему делает метод public MyClass CreateObjMC(MyClass obj)?
1
8 / 5 / 3
Регистрация: 19.09.2019
Сообщений: 88
07.11.2019, 07:59  [ТС] 5
Toros1992, могу написать условие целиком

Добавлено через 5 минут
Текст задачи полностью:
"Напишите программу, в которой есть базовый класс с открытым текстовым полем. На его основе создаётся производный класс с дополнительным открытым символьным полем. Опишите в базовом классе виртуальный метод, который при вызове создаёт и возвращает результатом объект производного класса. Переопределите в производном классе этот метод так, чтобы он создавал и возвращал копию объекта, из которого вызывается."

Добавлено через 2 минуты
Цитата Сообщение от Toros1992 Посмотреть сообщение
И кстати, что по вашему делает метод public MyClass CreateObjMC(MyClass obj)?
Я думал копирует значение, но судя по появившемуся вопросу видимо всё же по ссылке)
0
Эксперт .NET
16745 / 12496 / 3285
Регистрация: 17.09.2011
Сообщений: 20,727
07.11.2019, 08:51 6
Цитата Сообщение от Шрайн Посмотреть сообщение
чтобы он создавал и возвращал копию объекта, из которого вызывается.
Перегруженный метод должен возвращать копию экземпляра, из которого он вызывается, а не копию передаваемого в него экземпляра.
Потому выбросьте перегрузку с параметром, а из переопределенного метода возвращайте новый экземпляр MyClass с теми же значениями полей, что у текущего.
1
Модератор
Эксперт .NET
13242 / 9538 / 2560
Регистрация: 21.04.2018
Сообщений: 28,153
Записей в блоге: 2
07.11.2019, 09:06 7
Шрайн, вам по задаче нужно задать метод возвращающий производный класс, но в базовом типе.
Так, например, можно задать метод копирования

Базовый класс
C#
1
2
3
4
5
6
public class BaseClass
{
     public string BaseProperty {get; set;}
     public virtual BaseClass Copy ()
         => new BaseClass() {BaseProperty=BaseProperty};
}
Производный класс
C#
1
2
3
4
5
6
7
public class DerivedClass :BaseClass
{
     public string DerivedProperty {get; set;}
     public override BaseClass Copy ()
         => new DerivedClass() 
         {BaseProperty=BaseProperty, DerivedProperty=DerivedProperty};
}
1
897 / 552 / 274
Регистрация: 26.11.2015
Сообщений: 1,745
Записей в блоге: 2
07.11.2019, 09:14 8
Цитата Сообщение от Шрайн Посмотреть сообщение
Я думал копирует значение, но судя по появившемуся вопросу видимо всё же по ссылке)
Он просто возвращает еще одну ссылку на тот же самый объект
1
8 / 5 / 3
Регистрация: 19.09.2019
Сообщений: 88
08.11.2019, 08:32  [ТС] 9
Есть у меня мысль, что создание объекта базового класса не имеет смысла,
можно ли из объекта производного класса вызвать метод базового класса, если он, как в данном случае, переопределён?

Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
class Base
{
    public string text="qwerty";
    //создание объекта производного класса MyClass 
    public virtual MyClass CreateObjMC()// <-------------- можно этот метод вызвать из базового класса?
    {
        return new MyClass(this.text[1]);
    }
}
 
class MyClass:Base
{
    public char symbol;
    //конструктор
    public MyClass(char symbol)
    {
        this.symbol = symbol;
    }
    //переопределение метода базового класса
    //для копирования объекта
    public override MyClass CreateObjMC()
    {
        return new MyClass(this.symbol);
    }    
}
 
class Program
{
    static int Main()
    {
        //создание объекта базового класса
        //можно без этого?
        Base obj = new Base();        
        //создание объекта производного класса
        //из метода базового
        MyClass obj1 = obj.CreateObjMC();
 
        //создание объекта производного класса
        //путём копирования объекта производного класса
        MyClass obj2 = obj1.CreateObjMC();
        
        return 0;
    }
}
0
Модератор
Эксперт .NET
13242 / 9538 / 2560
Регистрация: 21.04.2018
Сообщений: 28,153
Записей в блоге: 2
08.11.2019, 09:28 10
Цитата Сообщение от Шрайн
Есть у меня мысль, что создание объекта базового класса не имеет смысла,
Неправильная мысль.
Базовый класс ничего не знает о своих наследниках.
И создание в базовом классе экземпляров производного класса действительно не должно быть.
Пример виртуального метода и его переопределения я показал выше.

Цитата Сообщение от Шрайн
можно ли из объекта производного класса вызвать метод базового класса
Можно.
Но зачем?

Иногда это имеет смысл.
Допустим, в базовом есть метод
C#
1
2
public override string ToString ()
       => $"BaseProperty=\"{BaseProperty}\"";
Можно его в производном переопределить так
C#
1
2
public override string ToString()
       => base.ToString() + $", DerivedProperty=\"{DerivedProperty}\"";
Но такое, как мне кажется, очень редко можно понадобиться.

Добавлено через 19 минут
Допустим, в общем случае, производный класс не может знать, как сделать полную копию базового типа.
Для этого надо воспользоваться методом базового типа
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class BaseClass
{
     public string BaseProperty {get; set;}
     public string privateField;
 
     public virtual void CopyTo (BaseClass copy)
     {
           copy.BaseProperty=BaseProperty;
           copy.privateField=privateField;
     }
 
     public virtual BaseClass Copy ()
     {
         BaseClass obj = new BaseClass();
         CopyTo(obj);
         return obj;
      }
}

А в производном так
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class DerivedClass :BaseClass
{
     public string DerivedProperty {get; set;}
 
     public override void CopyTo(BaseClass copy)
     {
          base.CopyTo(copy);
          if (copy is DerivedClass copyD)
          {
               copyD.DerivedProperty=DerivedPropert;
          }
     }
 
     public override BaseClass Copy ()
     {
         DerivedClass obj = new DerivedClass();
         CopyTo(obj);
         return obj;
      }
}
1
8 / 5 / 3
Регистрация: 19.09.2019
Сообщений: 88
08.11.2019, 09:46  [ТС] 11
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Есть у меня мысль, что создание объекта базового класса не имеет смысла,
Здесь я имел в виду, что нет практического смысла создавать объект с полями только базового класса.
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Базовый класс ничего не знает о своих наследниках.
И создание в базовом классе экземпляров производного класса действительно не должно быть.
Согласен, но по заданию требуется создать объект производного из метода базового, а затем в производном переопределить метод базового класса для копирования объекта производного производного класса в новый объект производного класса.
0
1518 / 443 / 125
Регистрация: 09.01.2018
Сообщений: 1,024
08.11.2019, 10:38 12
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    class BaseClass
    {
        public string StringField { get; set; }
 
        public virtual DerivedClass CreateObj()
        {
            return new DerivedClass();
        }
    }
 
    class DerivedClass : BaseClass
    {
        public char CharField { get; set; }
        public override DerivedClass CreateObj()
        {
            return MemberwiseClone() as DerivedClass;
        }
    }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
       static void Main(string[] args)
        {
            //testing
            var bClass = new BaseClass();
            var dClass = bClass.CreateObj();
            dClass.StringField = "field";
            dClass.CharField = 'z';
 
            var mwClone = dClass.CreateObj();
            Console.WriteLine(mwClone.StringField); //field
            Console.WriteLine(mwClone.CharField); //z
            Console.WriteLine(ReferenceEquals(dClass, mwClone)); //false (this is a shallow copy)
        }
1
Модератор
Эксперт .NET
13242 / 9538 / 2560
Регистрация: 21.04.2018
Сообщений: 28,153
Записей в блоге: 2
08.11.2019, 10:58 13
Цитата Сообщение от Шрайн
Согласен, но по заданию требуется создать объект производного из метода базового,
"Напишите программу, в которой есть базовый класс с открытым текстовым полем. На его основе создаётся производный класс с дополнительным открытым символьным полем. Опишите в базовом классе виртуальный метод, который при вызове создаёт и возвращает результатом объект производного класса. Переопределите в производном классе этот метод так, чтобы он создавал и возвращал копию объекта, из которого вызывается."
Там просто коряво изложено.
А имеется ввиду такая реализация как я показал.
То есть метод Copy определен в базовом классе.
Но для производного класса он возвращает экземпляр производного, но в типе базового.
Создать в базовом копию экземпляра в производном типе, в принципе, не возможно.
Так как производных может быть множество типов и в каком из них создавать копию?
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.11.2019, 10:58
Помогаю со студенческими работами здесь

Использование метода из наследованного класса к объекту базового класса
Есть метод public void OpExp() { if (Person._age&lt;18) ...

Перекрытие метода базового класса
Уважаемые форумчане, обьясните пожалуйста разницу между class A { public void...

Вызов метода базового класса
public class BaseClass { public virtual void Foo() { Console.WriteLine (&quot;BaseClass.Foo&quot;); } }...

Вызов метода из базового класса
привет! не могу понять, не доходит, как в c# сделать так чтобы из производного класса вызвать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru