Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
19 / 13 / 6
Регистрация: 29.08.2015
Сообщений: 115
.NET 3.x

Шаблонное наследование или как наследоваться от <T>?

09.12.2018, 22:56. Показов 1709. Ответов 2

Author24 — интернет-сервис помощи студентам
Хочу всем стандартным контролам прикрутить дополнительные плюшки, вроде всплывающих подсказок, текст которых можно задавать им через свойства, и подобное. Для TextBox сделал это так:
C# Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class TextBox : System.Windows.Forms.TextBox
    {
        private System.Windows.Forms.ToolTip ToolTip = new System.Windows.Forms.ToolTip();
        private string _ToolTipText;
 
        public string ToolTipText
        {
            get
            {
                return _ToolTipText;
            }
            set
            {
                _ToolTipText = value;
                ToolTip.SetToolTip(this, value);
            }
        }
    }
А после просто заменил при объявлении System.WindowsForms на пространство имен, где они описаны.
Но делать так для всех элементов не особо разумно, как мне кажется. Есть ли способ сделать что-то вроде
C# Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class MyControl: <T>
    {
        private System.Windows.Forms.ToolTip ToolTip = new System.Windows.Forms.ToolTip();
        private string _ToolTipText;
 
        public string ToolTipText
        {
            get
            {
                return _ToolTipText;
            }
            set
            {
                _ToolTipText = value;
                ToolTip.SetToolTip(this, value);
            }
        }
    }
, чтобы потом делать MyControl<TextBox> textBox1;? Или может есть еще какие-то адекватные способы решения такой задачи?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.12.2018, 22:56
Ответы с готовыми решениями:

Шаблонное наследование
Это не вопрос, просто выражение удивления у дилетанта. Я крайне удивился, когда такое сработало: #include &lt;iostream&gt; ...

Шаблонное наследование
#include &quot;stackcalculator.h&quot; #include &lt;cstring&gt; #include &quot;stack.h&quot; #include &quot;pointerstack.h&quot; int length = 100; template...

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

2
Эксперт .NET
6518 / 4094 / 1606
Регистрация: 09.05.2015
Сообщений: 9,559
09.12.2018, 23:47
Множественного наследования классов C# нет, а через generic'и вы такое врядли сделаете.

По идее можно сделать через Extension Method...

Для теста кидаете на форму 1 Tooltip, 1 Button и 3 Label'а

C# Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
 
            label1.SetTooltip(toolTip1, "tt1");
            label2.SetTooltip(toolTip1, "tt2");
            label3.SetTooltip(toolTip1, "tt3");
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show(label1.GetTooltip(toolTip1));
            MessageBox.Show(label2.GetTooltip(toolTip1));
            MessageBox.Show(label3.GetTooltip(toolTip1));
        }
    }
C# Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
    public static class ControlExtensions
    {
        public static void SetTooltip(this Control control, ToolTip tooltip, string text)
        {
            tooltip.SetToolTip(control, text);
        }
 
        public static string GetTooltip(this Control control, ToolTip tooltip)
        {
            return tooltip.GetToolTip(control);
        }
    }
0
Эксперт .NET
 Аватар для kolorotur
17810 / 12961 / 3381
Регистрация: 17.09.2011
Сообщений: 21,250
10.12.2018, 09:17
Цитата Сообщение от Jluc Посмотреть сообщение
Но делать так для всех элементов не особо разумно, как мне кажется
Совершенно верно.
В винформах уже есть компонент для того, что вам хочется сделать — он называется ToolTip.
В дизайнере формы найдите его в категории Common Controls и бросьте на форму — после этого на всех элементах управления в дизайнере появится новое свойство: ToolTip on <ИмяВашегоТултипа>.
Если тултипы надо устанавливать программно, то достаточно вызвать SetToolTip, передавая в него нужный элемент управления:
C# Скопировано
1
MyToolTip.SetToolTip(MyTextBox, "Karamba!");
При этом достаточно одного компонента ToolTip на всю форму и нет необходимости в наследовании.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.12.2018, 09:17
Помогаю со студенческими работами здесь

Как наследоваться от класса TIniFile?
class TFile : public TIniFile { void _fastcall SaveToFile(UnicodeString Path, TFL *L); void __fastcall LoadFromFile(UnicodeString...

Как правильно наследоваться от CActiveRecord в Yii?
Добрый день, Есть таблица ActiveRecord, производная от CActiveRecord. От первой я унаследовал все модели. В ActiveRecord единственный...

Как наследоваться от виджетов, нарисованных в QtDesigner?
Привет! Вот нарисовал я на CentralWidget (ну главный виджет формы) какой - то фрейм, как теперь создать класс, который бы ловил события...

Как правильно наследоваться с вложенным классом?
Приветствую. Есть класс, точнее 2. Один вложен в другой. class MatreshkaArray { private List&lt;MatreshkaUnit&gt;...

как отменить каскадирование или наследование
Привет! Создал плагин для вордпресс и вывожу таблицу через шорткод в клиентской части, к таблице применяю класс свой и ему задаю стили и...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Результаты исследования от команды MCM (март 2025 г.)
Programma_Boinc 07.04.2025
Результаты исследования от команды MCM (март 2025 г. ) В рамках наших текущих исследований мы продолжаем изучать гены, которые имеют наибольшую вероятность развития рака легких, выявленные в рамках. . .
Рекурсивные типы в Python
py-thonny 07.04.2025
Рекурсивные типы - это типы данных, которые определяются через самих себя или в сочетании с другими типами, которые в свою очередь ссылаются на исходный тип. В мире программирования такие структуры. . .
C++26: Объединение и конкатенация последовательностей и диапазонов в std::ranges
NullReferenced 07.04.2025
Работа с последовательностями данных – одна из фундаментальных задач, с которой сталкивается каждый разработчик. C++ прошел длинный путь в эволюции средств для манипуляции коллекциями – от. . .
Обмен данными в микросервисной архитектуре
ArchitectMsa 06.04.2025
Когда разработчики начинают погружаться в мир микросервисов, они часто сталкиваются с парадоксальным правилом: "два сервиса не должны делить один источник данных". Эта мантра звучит повсюду в. . .
PostgreSQL в Kubernetes: Автоматизация обслуживания с CNPG
Mr. Docker 06.04.2025
Администраторы баз данных сталкиваются с целым рядом проблем при обслуживании PostgreSQL в Kubernetes: как обеспечить правильную репликацию данных, как настроить автоматическое переключение при. . .
Async/await в TypeScript
run.dev 06.04.2025
Асинхронное программирование — это подход к разработке программного обеспечения, при котором операции выполняются независимо друг от друга. В отличие от синхронного выполнения, где каждая последующая. . .
Многопоточность в C#: Синхронизация потоков
UnmanagedCoder 06.04.2025
Многопоточное программирование стало неотъемлемой частью разработки современных приложений на C#. С появлением многоядерных процессоров возможность выполнять несколько задач параллельно значительно. . .
TypeScript: Классы и конструкторы
run.dev 06.04.2025
TypeScript, как статически типизированный язык, построенный на основе JavaScript, привнес в веб-разработку новый уровень надежности и структурированности кода. Одним из важнейших элементов этой. . .
Многопоточное программирование: Rust против C++
golander 06.04.2025
C++ существует уже несколько десятилетий и его поддержка параллелизма постепенно наращивалась со временем. Начиная с C++11, язык получил стандартную библиотеку для работы с потоками, а в последующих. . .
std::vector в C++: от основ к оптимизации производительности
NullReferenced 05.04.2025
Для многих программистов знакомство с std::vector происходит на ранних этапах изучения языка, но между базовым пониманием и подлинным мастерством лежит огромная дистанция. Контейнер std::vector. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер