Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/40: Рейтинг темы: голосов - 40, средняя оценка - 4.78
24 / 24 / 0
Регистрация: 24.01.2018
Сообщений: 54
1

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

15.02.2018, 13:02. Показов 8207. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет! Не могу полностью доделать задачу. Вот условие: вы вдруг поняли, что не очень-то удобно писать имя класса Geometry при выполнении любой операции с векторами и сегментами. Однако, отказаться от этого класса вы не можете, потому что за те несколько минут, пока вы сдавали предыдущую задачу, вашу библиотеку скачали и начали использовать в своих проектах тысячи человек.

Поэтому вы решили сохранить этот класс, но добавить методы Vector.GetLength(), Segment.GetLength(), Vector.Add(Vector), Vector.Belongs(Segment) и Segment.Contains(Vector) не вместо, а вместе с соответствующими методами класса Geometry.

Сделайте это! Каждый из этих методов должен вызывать уже существующий метод класса Geometry, чтобы не дублировать код.

Вся функциональность предыдущего этапа должна остаться!

Вся проблема в аргументах методов. Как избавиться от неё?

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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using GeometryTasks;
 
namespace GeometryTasks
{
    public class Vector
    {
        public double X;
        public double Y;
        public void GetLength(Vector vector)
        {
            Geometry.GetLength(vector);
        }
        public static void Add(Vector vector1, Vector vector2)
        {
            Geometry.Add(vector1, vector2);
        }
        public void Belongs(Vector vector,Segment segment)
        {
            Geometry.IsVectorInSegment(vector, segment);
        }
    }
    public class Geometry
    {
        public static double GetLength(Vector vector)
        {
            return (Math.Sqrt((vector.X * vector.X) + (vector.Y * vector.Y)));
        }
        public static Vector Add(Vector vector1, Vector vector2)
        {
            return (new Vector { X = vector1.X + vector2.X, Y = vector1.Y + vector2.Y });
        }
        public static double GetLength(Segment segment)
        {
            return (Math.Sqrt((segment.End.X - segment.Begin.X) * (segment.End.X - segment.Begin.X) + (segment.End.Y - segment.Begin.Y) * (segment.End.Y - segment.Begin.Y)));
        }
        public static bool IsVectorInSegment(Vector vector, Segment segment)
        {
            if (((vector.X == segment.Begin.X) || (vector.X == segment.End.X)) && ((vector.Y == segment.End.Y) || (vector.Y == segment.Begin.Y)))
            {
                return (true);
            }
            else
            {
                return (((vector.X - segment.Begin.X) * (vector.X - segment.End.X) <= 0) && ((vector.Y - segment.Begin.Y) * (vector.Y - segment.End.Y) < 0));
            }
        }
    }
    public class Segment
    {
        public Vector Begin;
        public Vector End;
        public void GetLength(Segment segment)
        {
            Geometry.GetLength(segment);
        }
        public void Contains(Vector vector, Segment segment)
        {
            Geometry.IsVectorInSegment(vector, segment);
        }
    }
}

Вот ошибка: Exception on: new Vector().GetLength().AlmostEqual(0)
Method `GetLength` with apropriate parameters is not found in type `Vector`

Добавлено через 17 минут
Немного исправил код, теперь нужна помощь с вызовом самой функции: using System;
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using GeometryTasks;
 
namespace GeometryTasks
{
    public class Vector
    {
        public double X;
        public double Y;
        public void GetLength()
        {
            Geometry.GetLength(X);
        }
        public static void Add(Vector vector)
        {
            Geometry.Add(vector1, vector2);
        }
        public void Belongs(Segment segment)
        {
            Geometry.IsVectorInSegment(vector, segment);
        }
    }
    public class Geometry
    {
        public static double GetLength(Vector vector)
        {
            return (Math.Sqrt((vector.X * vector.X) + (vector.Y * vector.Y)));
        }
        public static Vector Add(Vector vector1, Vector vector2)
        {
            return (new Vector { X = vector1.X + vector2.X, Y = vector1.Y + vector2.Y });
        }
        public static double GetLength(Segment segment)
        {
            return (Math.Sqrt((segment.End.X - segment.Begin.X) * (segment.End.X - segment.Begin.X) + (segment.End.Y - segment.Begin.Y) * (segment.End.Y - segment.Begin.Y)));
        }
        public static bool IsVectorInSegment(Vector vector, Segment segment)
        {
            if (((vector.X == segment.Begin.X) || (vector.X == segment.End.X)) && ((vector.Y == segment.End.Y) || (vector.Y == segment.Begin.Y)))
            {
                return (true);
            }
            else
            {
                return (((vector.X - segment.Begin.X) * (vector.X - segment.End.X) <= 0) && ((vector.Y - segment.Begin.Y) * (vector.Y - segment.End.Y) < 0));
            }
        }
    }
    public class Segment
    {
        public Vector Begin;
        public Vector End;
        public void GetLength()
        {
            Geometry.GetLength();
        }
        public void Contains(Vector vector)
        {
            Geometry.IsVectorInSegment(vector, segment);
        }
    }
}
1
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.02.2018, 13:02
Ответы с готовыми решениями:

Вызов методов классов друг у друга (вызов метода из другого класса)
Есть несколько классов, которые могут вызывать методы (функции) друг у друга. Логика: класс1 имеет...

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

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

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

9
910 / 795 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
15.02.2018, 13:40 2
когда вектор нужно передать в классе вектора, лучше делать так, а не Х передавать
C#
1
2
3
4
 public void GetLength()
        {
            Geometry.GetLength(this);
        }
Добавлено через 4 минуты
а вообще, что-то мне подсказывает, что Вам нужно наследование, если нет, тогда внутри метода у вектора и сегмента, нужно создавать класс геометрии
1
24 / 24 / 0
Регистрация: 24.01.2018
Сообщений: 54
15.02.2018, 13:42  [ТС] 3
А в остальных функциях как?

Добавлено через 35 секунд
Тема наследования идёт следующей, а значит, что без него надо.
1
910 / 795 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
15.02.2018, 13:46 4
Vector.GetLength() - описал
Segment.GetLength()- точно также без каких либо изменений
Vector.Add(Vector)-
C#
1
2
3
4
public void Add(Vector vector)
        {
            Geometry.Add(this, vector);
        }
Vector.Belongs(Segment) - такого метода в геометрии нет
Segment.Contains(Vector) - такого метода в геометрии нет
1
24 / 24 / 0
Регистрация: 24.01.2018
Сообщений: 54
15.02.2018, 13:49  [ТС] 5
Сейчас доделаю и скину. 5 минут ожидания, пожалуйста)
1
910 / 795 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
15.02.2018, 13:50 6
Лучший ответ Сообщение было отмечено denkipo как решение

Решение

на основе Вашего кода:
Vector.Belongs(Segment)
C#
1
2
3
4
public void Belongs(Segment segment)
        {
            Geometry.IsVectorInSegment(this, segment);
        }
Segment.Contains(Vector)
C#
1
2
3
4
public void Contains(Vector vector)
        {
            Geometry.IsVectorInSegment(vector, this);
        }
2
24 / 24 / 0
Регистрация: 24.01.2018
Сообщений: 54
15.02.2018, 13:53  [ТС] 7
Вот что получилось, так?
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using GeometryTasks;
 
namespace GeometryTasks
{
    public class Vector
    {
        public double X;
        public double Y;
        public void GetLength()
        {
            Geometry.GetLength(this);
        }
        public void Add(Vector vector)
        {
            Geometry.Add(this, vector);
        }
        public void Belongs(Segment segment)
        {
            Geometry.IsVectorInSegment(this, segment);
        }
    }
    public class Geometry
    {
        public static double GetLength(Vector vector)
        {
            return (Math.Sqrt((vector.X * vector.X) + (vector.Y * vector.Y)));
        }
        public static Vector Add(Vector vector1, Vector vector2)
        {
            return (new Vector { X = vector1.X + vector2.X, Y = vector1.Y + vector2.Y });
        }
        public static double GetLength(Segment segment)
        {
            return (Math.Sqrt((segment.End.X - segment.Begin.X) * (segment.End.X - segment.Begin.X) + (segment.End.Y - segment.Begin.Y) * (segment.End.Y - segment.Begin.Y)));
        }
        public static bool IsVectorInSegment(Vector vector, Segment segment)
        {
            if (((vector.X == segment.Begin.X) || (vector.X == segment.End.X)) && ((vector.Y == segment.End.Y) || (vector.Y == segment.Begin.Y)))
            {
                return (true);
            }
            else
            {
                return (((vector.X - segment.Begin.X) * (vector.X - segment.End.X) <= 0) && ((vector.Y - segment.Begin.Y) * (vector.Y - segment.End.Y) < 0));
            }
        }
    }
    public class Segment
    {
        public Vector Begin;
        public Vector End;
        public void GetLength()
        {
            Geometry.GetLength(this);
        }
        public void Contains(Vector vector)
        {
            Geometry.IsVectorInSegment(vector, this);
        }
    }
}
Добавлено через 1 минуту
Выдаёт ошибку Exception on: new Vector().GetLength().AlmostEqual(0)
Object reference not set to an instance of an object.
1
910 / 795 / 329
Регистрация: 08.02.2014
Сообщений: 2,391
15.02.2018, 13:59 8
вы каждую ошибку будете писать сюда? или хоть чуть чуть включите голову и воспользуетесь отладчиком чтобы посмотреть где именно у Вас не создалось, и что не создалось, ошибка указывает что вы обращаетесь к null и пытаетесь там что-то забрать.
1
36 / 34 / 13
Регистрация: 03.06.2010
Сообщений: 215
17.06.2018, 17:05 9
denkipo, не нужно было использовать void

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
50
51
52
53
using System;
 
namespace GeometryTasks
{
    public class Vector
    {
        public double X;
        public double Y;
 
        public double GetLength() => Geometry.GetLength(this);
 
        public Vector Add(Vector vector) => Geometry.Add(this, vector);
        
        public bool Belongs(Segment segment) => Geometry.IsVectorInSegment(this, segment);
    }
 
    public class Geometry
    {
        public static double GetLength(Vector vector) 
            => Math.Sqrt(vector.X * vector.X + vector.Y * vector.Y);
 
        public static Vector Add(Vector vectorA, Vector vectorB) 
            => new Vector() { X = vectorA.X + vectorB.X, Y = vectorA.Y + vectorB.Y };
 
        public static double GetLength(Segment segment)
            => Math.Sqrt((segment.End.X - segment.Begin.X) * (segment.End.X - segment.Begin.X)
                + (segment.End.Y - segment.Begin.Y) * (segment.End.Y - segment.Begin.Y));
 
        public static bool IsVectorInSegment(Vector vector, Segment segment)
        {
            if ((vector.X == segment.Begin.X || vector.X == segment.End.X) 
                && (vector.Y == segment.End.Y || vector.Y == segment.Begin.Y))
            {
                return true;
            }
            else
            {
                return ((vector.X - segment.Begin.X) * (vector.X - segment.End.X) <= 0) 
                    && ((vector.Y - segment.Begin.Y) * (vector.Y - segment.End.Y) < 0);
            }
        }
    }
 
    public class Segment
    {
        public Vector Begin;
        public Vector End;
 
        public double GetLength() => Geometry.GetLength(this);
 
        public bool Contains(Vector vector) => Geometry.IsVectorInSegment(vector, this);
    }
}
0
2 / 2 / 0
Регистрация: 13.05.2016
Сообщений: 5
28.06.2019, 16:56 10
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace GeometryTasks
{
    public class Vector
    {
        public double X;
        public double Y;
       
        public double GetLength()
        {
            return Geometry.GetLength(this);
        }
        public Vector Add(Vector vector)
        {
            return Geometry.Add(this, vector);
        }
        public bool Belongs(Segment segment)
        {
            return Geometry.IsVectorInSegment(this, segment);
        }
    }
 
    public class Segment
    {
        public Vector Begin;
        public Vector End;
        public double GetLength()
        {
            return Geometry.GetLength(this);
        }
        public bool Contains(Vector vector)
        {
            return Geometry.IsVectorInSegment(vector, this);
        }
    }
 
    public class Geometry
    {
        public static double GetLength(Vector vector)
        {
            return Math.Sqrt((vector.X*vector.X)+(vector.Y * vector.Y));
        }
 
        public static double GetLength(Segment segment)
        {
            return Math.Sqrt((segment.End.X - segment.Begin.X) * (segment.End.X - segment.Begin.X) + (segment.End.Y - segment.Begin.Y) * (segment.End.Y - segment.Begin.Y));
        }
 
        public static bool IsVectorInSegment(Vector vector, Segment segment)
        {
            if (vector.X == segment.Begin.X && vector.X == segment.End.X && vector.Y == segment.Begin.Y && vector.Y == segment.End.Y) return true;
                else
                {
                    return ((vector.X - segment.Begin.X) 
                    * (segment.End.Y - segment.Begin.Y) 
                    == (segment.End.X - segment.Begin.X) 
                    * (vector.Y - segment.Begin.Y)) 
                    && (vector.X >= segment.Begin.X 
                    && vector.X <= segment.End.X 
                    && vector.Y >= segment.Begin.Y 
                    && vector.Y <= segment.End.Y);
            
                }
        }
 
        public static Vector Add(Vector vector1, Vector vector2)
        {
            return new Vector { X = vector1.X + vector2.X, Y = vector1.Y + vector2.Y };
        }
    }
}
0
28.06.2019, 16:56
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.06.2019, 16:56
Помогаю со студенческими работами здесь

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

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

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

Экземпляр класса как входные данные метода другого класса
Можно ли в качестве входных данных метода передать экземпляр метода другого класса? Если да, то как?


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru