powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Интерфейсы-ошибка
7 сообщений из 7, страница 1 из 1
Интерфейсы-ошибка
    #39625191
Фотография mraklbrw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.
Есть интерфейсы и классы, которые их реализуют.


Код: 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.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
354.
355.
356.
357.
358.
359.
360.
361.
362.
363.
364.
365.
366.
367.
368.
369.
370.
371.
372.
373.
374.
375.
376.
377.
378.
379.
380.
381.
382.
383.
384.
385.
386.
387.
388.
389.
390.
391.
392.
393.
394.
395.
396.
397.
398.
399.
400.
401.
402.
403.
404.
405.
406.
407.
408.
409.
410.
411.
412.
413.
414.
415.
416.
417.
418.
419.
420.
421.
422.
423.
424.
425.
426.
427.
428.
429.
430.
431.
432.
433.
434.
435.
436.
437.
438.
439.
440.
441.
442.
443.
444.
445.
446.
447.
448.
449.
450.
451.
452.
453.
454.
455.
456.
457.
458.
459.
460.
461.
462.
463.
464.
465.
466.
467.
468.
469.
470.
471.
472.
473.
474.
475.
476.
477.
478.
479.
480.
481.
482.
483.
484.
485.
486.
487.
488.
489.
490.
491.
492.
493.
494.
495.
496.
497.
498.
499.
500.
501.
502.
503.
504.
505.
506.
507.
508.
509.
510.
511.
512.
513.
514.
515.
516.
517.
518.
519.
520.
521.
522.
523.
524.
525.
526.
527.
528.
529.
530.
531.
532.
533.
534.
535.
536.
537.
538.
539.
540.
541.
542.
543.
544.
545.
546.
547.
548.
549.
550.
551.
552.
553.
554.
555.
556.
557.
558.
559.
560.
561.
562.
563.
564.
565.
566.
567.
568.
569.
570.
571.
572.
573.
574.
575.
576.
577.
578.
579.
580.
581.
582.
583.
584.
585.
586.
587.
588.
589.
590.
591.
592.
593.
594.
595.
596.
597.
598.
599.
600.
601.
602.
603.
604.
605.
606.
607.
608.
609.
610.
611.
612.
613.
614.
615.
616.
617.
618.
619.
620.
621.
622.
623.
624.
625.
626.
627.
628.
629.
630.
631.
632.
633.
634.
635.
636.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Lab_Interfaces_10
{
    public interface ILimits<T>
    {
        T GetMinValue();
        T GetMaxValue();
    }

    public interface IOperations<T>
    {
        void AddElement(T data);
        bool RemoveElement(T data);
        bool FindElement(T data);
    }

    public class LinkedList<T> where T : IComparable<T>, IOperations<T>, ILimits<T>
    {
        public class Node<T>
        {
            public Node(T data)
            {
                Data = data;
            }

            public T Data { get; set; }
            public Node<T> Next { get; set; }

        }

        Node<T> head; // Первый элемент
        Node<T> tail; // Последний элемент
        int count;

        public void AddElement(T data)
        {
            Node<T> node = new Node<T>(data);

            if (head == null)
                head = node;
            else
                tail.Next = node;
            tail = node;

            count++;
        }

        public bool RemoveElement(T data)
        {
            Node<T> current = head;
            Node<T> previous = null;

            while (current != null)
            {
                if (current.Data.Equals(data))
                {
                    // Если узел в середине или в конце
                    if (previous != null)
                    {
                        // Убираем узел current, теперь previous ссылается не на current, а на current.Next
                        previous.Next = current.Next;

                        // Если current.Next не установлен, значит узел последний,изменяем переменную tail
                        if (current.Next == null)
                            tail = previous;
                    }
                    else
                    {
                        // Если удаляется первый элемент, переустанавливаем значение head
                        head = head.Next;

                        // Если после удаления список пуст, сбрасываем tail
                        if (head == null)
                            tail = null;
                    }

                    count--;
                    return true;
                }

                previous = current;
                current = current.Next;
            }

            return false;
        }

        public bool FindElement(T data)
        {
            Node<T> current = head;

            while (current != null)
            {
                if (current.Data.Equals(data))
                    return true;
                current = current.Next;
            }

            return false;
        }

        public void Clear()
        {
            head = null;
            tail = null;
            count = 0;
        }

        public T GetMinValue()
        {
            Node<T> val = head;
            Node<T> current = head;

            while (current != null)
            {
                int cv1 = val.Data.CompareTo(current.Data);
                if (cv1 < 0) // Новый элемент > элемент
                    val = current;
                current = current.Next;
            }

            return val.Data;
        }

        public T GetMaxValue()
        {
            Node<T> val = head;
            Node<T> current = head;

            while (current != null)
            {
                int cv1 = val.Data.CompareTo(current.Data);
                if (cv1 > 0) // Новый элемент < элемент
                    val = current;
                current = current.Next;
            }

            return val.Data;
        }

        public string GetStringPresentation()
        {
            string str = "";
            Node<T> current = head;
            if (current.Data != null)
                str += current.Data;

            while (current != null)
            {
                current = current.Next;
                if (current != null)
                    str += current.Data;
            }

            return str;
        }

    }

    public class BinaryNode<T>
    {
        public BinaryNode<T> Left { get; set; } // Левое поддерево
        public BinaryNode<T> Right { get; set; } // Правое поддеревго
        public T value { get; set; } // Числовое значение вершины
        public int level { get; set; } // Уровень дерева, на котором находится вершина

        public BinaryNode(T value)
        {
            // Констркутор вершины
            // На вход даём числовое значение вершины

            this.value = value;
            Left = null;
            Right = null;
        }

        // Возвращает уровень, накотором находится вершина
        public int GetLevel()
        {
            return level;
        }

        // Возвращает последнего правого потомка вершины
        public BinaryNode<T> GetLastRight()
        {
            return this.Right == null ? this : this.Right.GetLastRight();
        }

    }

    public class BinaryTree<T> where T : IComparable<T>, ILimits<T>, IOperations<T>
    {
        public BinaryNode<T> node_root; // Корневая вершина
        private int count; // Кол-во вершины
        private T min_value; // Минимальное значение вершины
        private T max_value; // Максимальное значение вершины
        private int max_level; // Уровень дерева

        public BinaryTree(BinaryNode<T> root_node)
        {
            this.node_root = root_node;
            this.count = 1; // Поправка на корневую вершину
            this.max_level = 0;
            //this.min_value = node_root.value;
            //this.max_value = node_root.value;
        }

        public BinaryTree()
        {
            this.node_root = null;
            this.count = 0; // Поправка на корневую вершину
            this.max_level = 0;
            //this.min_value = null;
            //this.max_value = int.MinValue;
        }

        // Возвращает количество вершин в дереве
        public int GetNodesCount() { return count; }
      

        // Возвращает минимальное значение вершины в дереве
        public T GetMinValue() { return min_value; }

        // Возвращает максимальное значение вершины в дереве
        public T GetMaxValue() { return max_value; }
        

        // Возвращает уровень дерева
        public int GetMaxLevel() { return max_level; }

        // Поиск максимального элемента с целью установки значения поля max_value
        public void FindMaxElement(BinaryNode<T> node)
        {
            if (node.Right != null)
                FindMaxElement(node.Right);
            else
                max_value = node.value;
        }

        // Поиск минимального элемента с целью установки значения поля min_value
        public void FindMinElement(BinaryNode<T> node)
        {
            if (node.Left != null)
                FindMinElement(node.Left);
            else
                min_value = node.value;
        }

        public void FindMaxElementTEMP()
        {
            BinaryNode<T> TempNode = node_root;
            while (TempNode.Right != null)
                TempNode = TempNode.Right;
            min_value = TempNode.value;
        }

        public void FindMinElementTEMP()
        {
            BinaryNode<T> TempNode = node_root;
            while (TempNode.Left != null)
                TempNode = TempNode.Left;
            min_value = TempNode.value;
        }

        // Добавление элемента - оболочка
        public void AddElement(T new_value)
        {

            int cv1 = max_value.CompareTo(new_value);
            if (cv1 < 0)
                max_value = new_value;
            int cv2 = min_value.CompareTo(new_value);
            if (cv2 > 0)
                min_value = new_value;



            //FindMaxElementTEMP();
            //FindMinElementTEMP();



            int level = 0;

            if (node_root == null)
            {
                node_root = new BinaryNode<T>(new_value);
                node_root.level = level;
                count++;
                return;
            }
            else
                AddElement(node_root, new_value, level);
        }

        // Добавление элемента - рекурсивная
        private void AddElement(BinaryNode<T> node, T new_value, int level)
        {

            int cv1 = node_root.value.CompareTo(new_value);

            if (cv1 < 0) // Новый элемент > элемент
            {
                // Проверяем правую ветвь
                if (node.Right == null)
                {
                    node.Right = new BinaryNode<T>(new_value);
                    node.Right.level = level;
                    count++; // Увеличение счётчика вершин в дереве
                    level++; // Увеличение уровня вершины

                    if (level > max_level)
                        max_level = level;
                }
                else
                    AddElement(node.Right, new_value, level + 1);
            }
            else if (cv1 > 0) // Новый элемент < элемент
            {
                // Проверяем левую ветвь
                if (node.Left == null)
                {
                    node.Left = new BinaryNode<T>(new_value);
                    node.Left.level = level;
                    count++; // Увеличение счётчика вершин в дереве
                    level++; // Увеличение уровня вершины

                    if (level > max_level)
                        max_level = level;
                }
                else
                    AddElement(node.Left, new_value, level + 1);
            }
        }

        // Удаление элемента
        public void RemoveElement(T value)
        {
            if (!FindElement(value))
                return;

            BinaryNode<T> delNode = FindNode(value);

            // Если это терминальная вершина
            if (delNode.Left == null && delNode.Right == null)
            {
                BinaryNode<T> delNodeParent = FindNodeParent(delNode.value); // Ищем родительскую вершину для удаляемой вершины

                if (delNodeParent.Left == delNode)
                {
                    delNodeParent.Left = null;
                    count--; // Уменьшаем счётчик количества вершин в дереве
                    FindMaxElement(node_root);
                    FindMinElement(node_root);
                    return;
                }
                else
                {
                    delNodeParent.Right = null;
                    count--; // Уменьшаем счётчик количества вершин в дереве
                    FindMaxElement(node_root);
                    FindMinElement(node_root);
                    return;
                }
            }

            // Удаляемая вершина имеет только левого потомка
            if (delNode.Left != null && delNode.Right == null)
            {
                BinaryNode<T> delNodeParent = FindNodeParent(delNode.value); // Ищем родительскую вершину для удаляемой вершины
                delNodeParent.Left = delNode.Left;
                count--; // Уменьшаем счётчик количества вершин в дереве
                FindMaxElement(node_root);
                FindMinElement(node_root);
                return;
            }

            // Удаляемая вершина имеет только правого потомка
            if (delNode.Left == null && delNode.Right != null)
            {
                BinaryNode<T> delNodeParent = FindNodeParent(delNode.value); // Ищем родительскую вершину для удаляемой вершины
                delNodeParent.Right = delNode.Right;
                count--; // Уменьшаем счётчик количества вершин в дереве
                FindMaxElement(node_root);
                FindMinElement(node_root);
                return;
            }

            // Удаляемая вершина имеет и левого, и правого потомка
            if (delNode.Left != null && delNode.Right != null)
            {
                BinaryNode<T> delNodeParent = FindNodeParent(delNode.value); // Ищем родительскую вершину для удаляемой вершины

                // Левый потомок удаляемой вершины не имеет правого потомка
                if (delNode.Left.Right == null)
                {
                    BinaryNode<T> tt = delNode.Right;
                    BinaryNode<T> tt2 = delNode.Left;
                    delNodeParent.Left = tt2;
                    delNode.Left.Right = tt;

                    count--; // Уменьшаем счётчик количества вершин в дереве
                    FindMaxElement(node_root);
                    FindMinElement(node_root);
                    return;
                }

                // Левый потомок удаляемой вершины имеет правого потомка
                if (delNode.Left.Right != null)
                {
                    BinaryNode<T> delNodeLeftLastRight = delNode.Left.GetLastRight();

                    // У крайней правой вершины от левого потомка удаляемой вершины нет левого потомка
                    if (delNodeLeftLastRight.Left == null)
                    {
                        BinaryNode<T> tt = delNode.Left;
                        tt.Right = null;
                        BinaryNode<T> tt2 = delNode.Right;
                        delNodeParent = delNodeLeftLastRight;
                        delNodeLeftLastRight.Left = tt;
                        delNodeLeftLastRight.Right = tt2;

                        count--; // Уменьшаем счётчик количества вершин в дереве
                        FindMaxElement(node_root);
                        FindMinElement(node_root);
                        return;
                    }
                    else
                    {
                        BinaryNode<T> t2 = delNode.Left;
                        BinaryNode<T> t3 = delNode.Right;
                        BinaryNode<T> delNodeLeftLastRightParent = FindNodeParent(delNodeLeftLastRight.value); // Родитель крайней правой вершины от левого потомка удаляемой вершины
                        delNodeLeftLastRightParent.Right = delNodeLeftLastRight.Left;
                        delNodeParent.Left = delNodeLeftLastRight;
                        delNodeParent.Left.Left = t2;
                        delNodeParent.Left.Right = t3;

                        count--; // Уменьшаем счётчик количества вершин в дереве
                        FindMaxElement(node_root);
                        FindMinElement(node_root);
                        return;
                    }
                }

            }
        }

        // Поиск элемента - оболочка
        public bool FindElement(T search_value)
        {
            return Find_Value(node_root, search_value) == true ? true : false;
        }

        // Поиск элемента - рекурсивная
        public bool Find_Value(BinaryNode<T> node, T search_value)
        {
            // На вход подаём корневую вершину

            int cv1 = node_root.value.CompareTo(search_value);

            if (cv1 == 0)
                return true;
            else if (cv1 > 0)
            {
                if (node.Left == null)
                    return false;
                else
                    return Find_Value(node.Left, search_value);
            }
            else if (cv1 < 0)
            {
                if (node.Right == null)
                    return false;
                else
                    return Find_Value(node.Right, search_value);
            }

            return false;
        }

        // Поиск вершины - возвращает вершину с заданным значением - оболочка
        public BinaryNode<T> FindNode(T search_value)
        {
            return Find_Node(node_root, search_value);
        }

        // Поиск вершины - рекурсивная
        private BinaryNode<T> Find_Node(BinaryNode<T> node, T search_value)
        {
            int cv1 = node_root.value.CompareTo(search_value);

            if (cv1 == 0)
            {
                return node;
            }
            else if (cv1 > 0)
            {
                if (node.Left == null)
                    return null;
                else
                    return Find_Node(node.Left, search_value);
            }
            else if (cv1 < 0)
            {
                if (node.Right == null)
                    return null;

                else
                    return Find_Node(node.Right, search_value);
            }

            return null;
        }

        // Поиск родителя вершины - оболочка
        public BinaryNode<T> FindNodeParent(T search_value)
        {
            return Find_Node_Parent(node_root, search_value);
        }

        // Поиск родителя вершины - рекурсивная
        private BinaryNode<T> Find_Node_Parent(BinaryNode<T> node, T search_value)
        {
            if (node.Left != null)
            {
                int cv1 = node.Left.value.CompareTo(search_value);

                if (cv1 == 0)
                {
                    return node;
                }
                if (Find_Node_Parent(node.Left, search_value) != null)
                    return Find_Node_Parent(node.Left, search_value);
            }
            if (node.Right != null)
            {
                int cv1 = node.Right.value.CompareTo(search_value);

                if (cv1 == 0)
                {
                    return node;
                }
                if (Find_Node_Parent(node.Right, search_value) != null)
                    return Find_Node_Parent(node.Right, search_value);
            }

            return null;
        }

        // Прямой обход дерева
        public void TraversePreorder(BinaryNode<T> node)
        {
            // На вход подаём корневую вершину

            // Здесь можем выполнять какие-нибудь действия

            MessageBox.Show(Convert.ToString(node.value));

            if (node.Left != null)
                TraversePreorder(node.Left);
            if (node.Right != null)
                TraversePreorder(node.Right);
        }

        // Симметрический обход дерева
        public void TraverseInorder(BinaryNode<T> node)
        {
            // На вход подаём корневую вершину

            if (node.Left != null)
                TraverseInorder(node.Left);

            // Здесь можем выполнять какие-нибудь действия

            MessageBox.Show(Convert.ToString(node.value));

            if (node.Right != null)
                TraverseInorder(node.Right);
        }

        // Обход дерева в обратном порядке
        public void TraversePostorder(BinaryNode<T> node)
        {
            // На вход подаём корневую вершину

            if (node.Left != null)
                TraversePostorder(node.Left);
            if (node.Right != null)
                TraversePostorder(node.Right);

            // Здесь можем выполнять какие-нибудь действия

            MessageBox.Show(Convert.ToString(node.value));
        }

        // Обход дерева в ширину
        public void TraverseDepth(BinaryNode<T> node)
        {
            // На вход подаём корневую вершину

            Queue<BinaryNode<T>> children = new Queue<BinaryNode<T>>();

            children.Enqueue(node); // Помещаем корень в очередь

            while (children.Count != 0) // Пока очередь не пуста
            {
                BinaryNode<T> nodeT = children.Dequeue(); // Берём следующую вершину из очереди

                // Здесь можем выполнять какие-нибудь действия

                MessageBox.Show(Convert.ToString(nodeT.value));

                if (nodeT.Left != null)
                    children.Enqueue(nodeT.Left);
                if (nodeT.Right != null)
                    children.Enqueue(nodeT.Right);
            }
        }

        // Удаление дерева
        public void Clear()
        {
            node_root = null;
        }


    }


}




При создании списка объектов классов:
Код: c#
1.
2.
LinkedList<long> list1;
BinaryTree<int> bt1;


возникает ошибка "Тип long не может быть использован как параметр типа T в универсальном типе или методе LinkedList<T>. Нет преобразования-упаковки из long в IOperations<long>"

Не могу понять, что требуется сделать.
...
Рейтинг: 0 / 0
Интерфейсы-ошибка
    #39625194
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mraklbrw,

Ссылочного типа хочет
...
Рейтинг: 0 / 0
Интерфейсы-ошибка
    #39625197
Фотография mraklbrw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А для типа значений данные интерфейсы реализовать не получится?
...
Рейтинг: 0 / 0
Интерфейсы-ошибка
    #39625216
Pallaris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mraklbrw
При создании списка объектов классов:
Код: c#
1.
2.
LinkedList<long> list1;
BinaryTree<int> bt1;


возникает ошибка "Тип long не может быть использован как параметр типа T в универсальном типе или методе LinkedList<T>. Нет преобразования-упаковки из long в IOperations<long>"

Не могу понять, что требуется сделать.

Код: c#
1.
public class LinkedList<T> where T : IComparable<T>, IOperations<T>, ILimits<T>



Тип T должен реализовывать IOperations<T>. Может быть типом-значением
...
Рейтинг: 0 / 0
Интерфейсы-ошибка
    #39625217
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mraklbrwНе могу понять, что требуется сделать.

Требуется создать свои типы

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
public struct MyLong : IComparable<MyLong >, ILimits<MyLong >, IOperations<MyLong >
{
    public MyLong(long value)
    {
    }

    ...
}



И использовать вместо long, int.. так как в long и int поддержку своих интерфейсов вы не сунете, ну никак.
...
Рейтинг: 0 / 0
Интерфейсы-ошибка
    #39625242
Фотография mraklbrw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Найдено такое решение (пользователем Fleder):
Код: c#
1.
2.
public class LinkedList<T> : IOperations<T>, ILimits<T> where T : IComparable<T>
public class BinaryTree<T> : IOperations<T>, ILimits<T> where T : IComparable<T>
...
Рейтинг: 0 / 0
Интерфейсы-ошибка
    #39625243
Фотография mraklbrw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt, у меня оказалось напутано в наследовании интерфейсов.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Интерфейсы-ошибка
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]