Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.59/64: Рейтинг темы: голосов - 64, средняя оценка - 4.59
0 / 6 / 2
Регистрация: 28.11.2012
Сообщений: 89
1

Вызов методов классов друг у друга (вызов метода из другого класса)

25.01.2019, 11:13. Показов 12171. Ответов 10
Метки нет (Все метки)

Есть несколько классов, которые могут вызывать методы (функции) друг у друга.
Логика: класс1 имеет метод А, класс2 имеет метод Б, класс1 вызывает метод Б из класса2, а класс2 может вызывать метод А из класса1. Методы между собой не взаимосвязаны, делают разные задачи.
Вариант1: чтобы вызывать методы одного класса из другого, попробовал вариант с добавлением данных записей в каждый класс:
C#
1
Class1 cl1 = new Class1 ();
и далее из класса2 вызов метода:
C#
1
cl1.deleteFile();
Тоже самое в классе 1 добавляем
C#
1
Class2 cl2 = new Class2 ();
и вызываем метод из класса2:
C#
1
cl2.moveFile();
Проблема: При использовании такого варианта происходит переполнение стека, логично, ведь в 1 и 2 классе у нас обращения к друг другу, делая "дубли" классов.
Тогда я оставил этот вариант и нашел на форумах другой.
Класс1:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Class1
    {
        public Class1(Class2 cl2)
        { 
           this.cl2= cl2;
        }
        Class2 cl2;
 
        public void test()
        {
           cl2.moveFile();
          //вызываем метод из другого класса, здесь cl2 имеет значение null
          //соответственно и ошибка дальше происходит
        }
    }
Класс2:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
class Class2
    {
        public Class2(Class1 cl1)
        { 
           this.cl1= cl1; 
        }
        Class1 cl1;
 
        public void moveFile()
        {
           //код метода...
        }
    }
Проблема: при вызове метода (cl2.moveFile() из Class1 ошибка "Ссылка на объект не указывает на экземпляр объекта.". Как исправить чтобы значение cl2 и cl1 не были null?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.01.2019, 11:13
Ответы с готовыми решениями:

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

Вызов метода из другого класса
Сабж, есть два класса, в разных неймспейсах namespace ImageFactory { internal class Common {...

Вызов метода другого класса
Приветствую, кто может подсказать по такому делу: нужно вызвать метод другого класса ...

Вызов метода из другого класса
Всем привет! Не могу полностью доделать задачу. Вот условие: вы вдруг поняли, что не очень-то...

10
19 / 13 / 8
Регистрация: 09.01.2019
Сообщений: 72
25.01.2019, 11:29 2
Как вы этот код используете? что в Main, так скажем?
0
314 / 243 / 148
Регистрация: 03.10.2017
Сообщений: 885
Записей в блоге: 1
25.01.2019, 11:33 3
Это ошибка указывает на то, что вы где-то не выделили память под объект. Операция "new"

Добавлено через 3 минуты
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
//Rextester.Program.Main is the entry point for your code. Don't change it.
//Compiler version 4.0.30319.17929 for Microsoft (R) .NET Framework 4.5
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
 
namespace Rextester
{
    public class Program
    {
        public static void Main(string[] args)
        {
            Class2 class2 = new Class2();
            Class1 class1 = new Class1(class2);
        }
    }
 
    class Class1
    {
        public Class1(Class2 cl2)
        {
            this.cl2 = cl2;
        }
        Class2 cl2;
 
        public void test()
        {
            cl2.moveFile();
            //вызываем метод из другого класса, здесь cl2 имеет значение null
            //соответственно и ошибка дальше происходит
        }
    }
 
    class Class2
    {
        public Class2()
        {
        }
 
        public void moveFile()
        {
            //код метода...
        }
    }
 
}
1
0 / 6 / 2
Регистрация: 28.11.2012
Сообщений: 89
25.01.2019, 11:42  [ТС] 4
Цитата Сообщение от csharp08 Посмотреть сообщение
Как вы этот код используете? что в Main, так скажем?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public partial class Main : Form
    {
        public Main()
        {
            cl1 = new Class1(this);
            cl2 = new Class2(this);
 
            InitializeComponent();
         }
         Class1 cl1;
         Class2 cl2;
         
         //и здесь также могут вызываться методы эти
        private void button_Start_Click(object sender, EventArgs e)
        {
            cl2.moveFile();
            или
            cl1.myMethod();
        }
     }
0
19 / 13 / 8
Регистрация: 09.01.2019
Сообщений: 72
25.01.2019, 11:44 5
почему инициализируете классы с this?
0
0 / 6 / 2
Регистрация: 28.11.2012
Сообщений: 89
25.01.2019, 11:48  [ТС] 6
Цитата Сообщение от Masson1848 Посмотреть сообщение
Это ошибка указывает на то, что вы где-то не выделили память под объект. Операция "new"
А если у меня каждый класс находится в отдельном файле, а не в Main.cs скажем так, там нет public static void Main(string[] args), как поступить? Извиняюсь если совсем "тугой" вопрос...

Добавлено через 2 минуты
Цитата Сообщение от csharp08 Посмотреть сообщение
почему инициализируете классы с this?
Если убрать this, ошибка - Class1 не содержит конструктор, который принимает аргументы 0
0
314 / 243 / 148
Регистрация: 03.10.2017
Сообщений: 885
Записей в блоге: 1
25.01.2019, 11:54 7
А вы пробовали это сделать? Оно всё прекрасно работает

Цитата Сообщение от stinger1000 Посмотреть сообщение
А если у меня каждый класс находится в отдельном файле, а не в Main.cs скажем так, там нет public static void Main(string[] args), как поступить? Извиняюсь если совсем "тугой" вопрос...
0
0 / 6 / 2
Регистрация: 28.11.2012
Сообщений: 89
25.01.2019, 11:59  [ТС] 8
Цитата Сообщение от Masson1848 Посмотреть сообщение
А вы пробовали это сделать? Оно всё прекрасно работает
Сейчас пробую, но другой вопрос теперь, если у меня не 2 класса таких, а 5 например, как будет выделение памяти выглядеть в public static void Main(string[] args)?
0
314 / 243 / 148
Регистрация: 03.10.2017
Сообщений: 885
Записей в блоге: 1
25.01.2019, 12:02 9
stinger1000, Память всегда выделяется через new
0
0 / 6 / 2
Регистрация: 28.11.2012
Сообщений: 89
25.01.2019, 12:06  [ТС] 10
Цитата Сообщение от Masson1848 Посмотреть сообщение
Память всегда выделяется через new
Это я понимаю, не понимаю каким образом для каждого из класса это будет писать, вот так?
C#
1
2
3
4
5
6
7
8
9
10
11
12
public static void Main(string[] args)
        {
            Class5 class5 = new Class5();
            Class4 class4 = new Class4();
            Class3 class3 = new Class3();
            Class2 class2 = new Class2();
            //здесь, дальше по коду не могу понять.... явно не так
            Class1 class1 = new Class1(class2);
            Class1 class1 = new Class1(class3);
            Class1 class1 = new Class1(class4);
            Class1 class1 = new Class1(class5);
        }
0
0 / 6 / 2
Регистрация: 28.11.2012
Сообщений: 89
25.01.2019, 14:46  [ТС] 11
Цитата Сообщение от Masson1848 Посмотреть сообщение
Это ошибка указывает на то, что вы где-то не выделили память под объект. Операция "new"
Создал готовый проект с ошибкой, прошу помощи, бьюсь уже несколько дней с проблемой...
Вложения
Тип файла: zip WindowsFormsApp1.zip (263.3 Кб, 3 просмотров)
0
25.01.2019, 14:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.01.2019, 14:46

Вызов метода кнопки из другого класса
Здравствуйте. Да, знаю, что ответы на такие вопросы в инэте есть. Делаю как там но не выдаёт...

Делегаты или вызов метода класса из другого класса
Добрый день! В попытке изучения c# наткнулся на такую проблему: 1. Зачем нужен делегат? Ведь я...

Вызов метода из другого класса, при этом нельзя создать объект второго класса и метод не статический
У меня есть 2 класса - один с формой и кнопкой на ней и другой класс, у которого есть метод void...

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


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

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

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