Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
Заблокирован

Наследование статического метода в интерфейсе

06.03.2016, 19:13. Показов 3868. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
знаю, это самые азы, но мне раньше просто не было необходимости писать интерфейсы (как то без них обходился) и вот сейчас возник такой вопрос: можно ли как то унаследовать именно статическую функцию?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.03.2016, 19:13
Ответы с готовыми решениями:

Создание объявления метода в интерфейсе с неизвестным количеством аргументов
Добрый день, такая проблема хочу сделать единый интерфейс IRotation, там должен быть метод Rotate, однако при реализации методы будут...

Настройка статического trunk-a на интерфейсе коммутатора, который ведёт к маршрутизатору
Доброго времени суток, люди добрые! Помогите с ЛР по копм сетям. Есть схема сети, которую нужно настроить в Cisco Packet Tracer (см....

Реализация метода в интерфейсе
привет. есть интерфейс base: interface base { function func(); }; этот интерфейс наследуется в derived:

21
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
06.03.2016, 19:22
Penelent, не совсем понимаю, что вы хотите сделать, но если вы хотите реализовать интерфейс статическим методом, то так делать нельзя, да и не особо нужно.
0
Заблокирован
06.03.2016, 19:38  [ТС]
EvilFromHell, я объясню что хочу: есть некий класс который надо сериализовывать и десериализовывать, с сериализацией все понятно она просто будет как обычная функция наследоваться, но вот десериализацию пока что я могу сделать только статичной функцией, т.к. пока что так и не выяснил как сделать копирующий конструктор чтобы не копировать по полям вручную ну или не копирующий конструктор а например функцию Load которая была бы не статичной, но суть та же что у копирующего конструктора
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
06.03.2016, 19:42
Penelent, а зачем вообще пытаться запихивать десериализацию в интерфейс? Для чего это делается?
0
Заблокирован
06.03.2016, 19:48  [ТС]
EvilFromHell, ну у меня просто несколько таких классов с сериализацией / десериализацией

Добавлено через 4 минуты
да в общем тут уже все, я понял что у интерфейса же не вызовешь эту статичную функцию... поэтому так и нельзя, другой вопрос что вот если бы мне удалось все таки сделать такой копирующий конструктор это был бы прямо прорыв!
0
 Аватар для Пaтрик
442 / 410 / 132
Регистрация: 21.01.2012
Сообщений: 976
06.03.2016, 19:57
Сколько свойств у вас в классе, что Вы боитесь прописать их ручками?
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
06.03.2016, 20:03
Не, ну можно с рефлексией поиграться... только не думаю, что это разумное и производительное решение.. у меня как-то такой проблемы вообще никогда не стояло-статические методы меня вполне устраивали
0
 Аватар для Пaтрик
442 / 410 / 132
Регистрация: 21.01.2012
Сообщений: 976
06.03.2016, 20:10
Хреномантией страдаете.
0
Заблокирован
06.03.2016, 20:45  [ТС]
Цитата Сообщение от EvilFromHell Посмотреть сообщение
Не, ну можно с рефлексией поиграться
да я уже об этом и думаю, я вот думаю как можно: взять ссылку на один и на второй объект и через memset (импортировать из dll) скопировать, а потом пройтись по всем полям (как в примере по ссылке выше) и скопировать в глубину тем же способом, щас буду тестить

Добавлено через 12 секунд
Цитата Сообщение от Пaтрик Посмотреть сообщение
Хреномантией страдаете.
скорее всего
0
 Аватар для Пaтрик
442 / 410 / 132
Регистрация: 21.01.2012
Сообщений: 976
06.03.2016, 20:48
Цитата Сообщение от Penelent Посмотреть сообщение
memset
У Вас в голове овсяная каша.
Давайте определимся по двум вопросам:
  1. Вам нужно глубокое копирование?
  2. Нужно ли Вам реально что-то сложное или обойтись можно простым присваиванием свойств, сколько у вас их?
0
Заблокирован
06.03.2016, 21:00  [ТС]
Цитата Сообщение от Пaтрик Посмотреть сообщение
Вам нужно глубокое копирование?
да
Цитата Сообщение от Пaтрик Посмотреть сообщение
Нужно ли Вам реально что-то сложное или обойтись можно простым присваиванием свойств, сколько у вас их?
я хочу создать общую функцию которая будет работать для любых классов (принимать ref ссылку на dest класс)

Добавлено через 2 минуты
Цитата Сообщение от Пaтрик Посмотреть сообщение
У Вас в голове овсяная каша.

Не по теме:

теперь не могу любые каши, у меня там картошечка жареная!!! :D

0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
06.03.2016, 21:20
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApplication61
{
    class Program
    {
        static void Main(string[] args)
        {
            var pr1 = new Perversion("A", "B");
            var pr2 = new Perversion(pr1);
            Console.WriteLine($"{pr2.Name}     {pr2.Value}");
            Console.Read();
        }
 
        public class Perversion
        {
            public string Name { get; set; }
            public string Value;
            public Perversion(string name,string value)
            {
                Name = name; Value = value;
            }
            public Perversion(Perversion p)
            {
                foreach(var prop in p.GetType().GetProperties())
                {
                    this.GetType().GetProperty(prop.Name).SetValue(this,prop.GetValue(p));
                }
                foreach (var f in p.GetType().GetFields())
                {
                    this.GetType().GetField(f.Name).SetValue(this, f.GetValue(p));
                }
            }
        }
    }
}
Для любителей извращений

Добавлено через 6 минут
Только еще для событий надо прилепить если они используются)
1
Заблокирован
06.03.2016, 21:28  [ТС]
Цитата Сообщение от EvilFromHell Посмотреть сообщение
GetProperties
Цитата Сообщение от EvilFromHell Посмотреть сообщение
GetFields
все бы хорошо, но GetProperties и GetFields кажется возвращают только открытые свойства и поля, а как насчет закрытых?
0
 Аватар для Пaтрик
442 / 410 / 132
Регистрация: 21.01.2012
Сообщений: 976
06.03.2016, 21:29
У вас не Deep Copy.
0
Заблокирован
06.03.2016, 21:41  [ТС]
пробовал даже вот так:
C#
1
GetFields(BindingFlags.Public | BindingFlags.NonPublic)
но так почему то вообще возвращает пустой массив

Добавлено через 2 минуты
опа нашел надо было еще включить BindingFlags.Instance
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
06.03.2016, 21:42
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Reflection;
namespace ConsoleApplication61
{
    class Program
    {
        static void Main(string[] args)
        {
            var pr1 = new Perversion("A", "B");
            var pr2 = new Perversion(pr1);
            Console.WriteLine($"{pr2.GetType().GetProperty("Name", Perversion.bf).GetValue(pr2, null)}     {pr2.GetType().GetField("Value", Perversion.bf).GetValue(pr2)}");
            Console.Read();
        }
 
        public class Perversion
        {
            public static BindingFlags bf = BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public;
            private string Name { get; set; }
            private string Value;
            public Perversion(string name,string value)
            {
                Name = name; Value = value;
            }
            public Perversion(Perversion p)
            {
                foreach(var prop in p.GetType().GetProperties(bf))
                {
                    this.GetType().GetProperty(prop.Name, bf).SetValue(this,prop.GetValue(p));
                }
                foreach (var f in p.GetType().GetFields(bf))
                {
                    this.GetType().GetField(f.Name, bf).SetValue(this, f.GetValue(p));
                }
            }
        }
    }
}
Добавлено через 1 минуту
Да, это не Deep. Если DeepCopy, то там надо еще проходиться по всем ссылкам и копировать все дочерние объекты.. А особенно весело будет, если ссылки окажутся цикличными... это тоже надо обработать... та еще заморочка..
0
Заблокирован
06.03.2016, 22:03  [ТС]
EvilFromHell, можешь еще по эвентам показать? там нет функций Get/SetValue

Добавлено через 9 минут
EvilFromHell, кстати еще и чего то не работает я вот так оформил общей функцией это дело только
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public static void DeepClone<T>(T source, ref T dest)
{
    var flags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;
 
    foreach (var prop in source.GetType().GetProperties(flags))
    {
        dest.GetType().GetProperty(prop.Name).SetValue(dest, prop.GetValue(prop));
    }
 
    foreach (var field in source.GetType().GetFields(flags))
    {
        dest.GetType().GetField(field.Name).SetValue(dest, field.GetValue(field));
    }
 
    /*foreach (var ev in source.GetType().GetEvents(flags))
    {
        dest.GetType().GetEvent(ev.Name).SetValue(dest, ev.GetValue(ev));
    }*/
}
и вызов
C#
1
2
3
4
5
6
7
8
9
10
public class A
{
    public int value1;
    public string value2;
    private float value3;
}
 
A a = new A();
var b = new A() { value1 = 5, value2 = "test" };
DeepClone(a, ref a);
дает ошибку: Поле 'value1', заданное для типа 'A' не является полем в целевом объекте, который имеет тип 'System.Reflection.RtFieldInfo'.

Добавлено через 5 минут
аа это понял, там ошибся field.GetValue(source)
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
06.03.2016, 22:10
Penelent, не пойму вас. Зачем вы пытаетесь сделать так:
C#
1
public static void DeepClone<T>(T source, ref T dest)
Если со статическим методом есть варианты намного лучше? Вы сами там привели в другой теме ссылку на код, который делает именно глубокую копию, проходясь по всем ссылкам(правда, возможно, тоже не все учитывает). Еще вам предложили вариант с сериализацией-самый простой. Вы бы лучше определились, что надо копировать конкретно в данном классе, и это копировали, а не пытались сделать полностью универсально. Ведь с большой долей вероятности, там не все надо копировать, а процедура это довольно таки медленная.
0
Заблокирован
06.03.2016, 22:15  [ТС]
EvilFromHell, ну пожалуйста покажи как эвенты скопировать очень я хочу так сделать! я обожаю такие извращения!

Добавлено через 2 минуты
оказывается в моей переделке там куча ошибок была, вот так вроде копирует нормально
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public static void Clone<T>(T source, ref T dest)
{
    var flags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;
 
    foreach (var sourceProp in source.GetType().GetProperties(flags))
    {
        var destType = dest.GetType();
        var destProp = destType.GetProperty(sourceProp.Name, flags);
        var sourcPropValue = sourceProp.GetValue(source);
        destProp.SetValue(dest, sourcPropValue);
    }
 
    foreach (var sourceField in source.GetType().GetFields(flags))
    {
        var destType = dest.GetType();
        var destField = destType.GetField(sourceField.Name, flags);
        var sourcFieldValue = sourceField.GetValue(source);
        destField.SetValue(dest, sourcFieldValue);
    }
}
вот только как с эвентами быть не знаю, хочу чтобы все копировалось что возможно, пусть даже это не deep copy пока что
0
 Аватар для Kruds
708 / 708 / 226
Регистрация: 04.03.2013
Сообщений: 1,384
06.03.2016, 22:23
Помнится один товарищ тут мутил deep copy с блекджеком и рефлексией.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.03.2016, 22:23
Помогаю со студенческими работами здесь

Наследование статического поля
Помогите пожалуйста разобраться с проблемой. Как можно замена статическое полю чтобы и одинаково у всех объектов и наследование...

Обращение к методу класса находящийся в интерфейсе из статик метода
С праздниками форумчане! У меня есть два файла, один с мейном второй с Персонами. В мейне читаю с клавиатуры, если &quot;моё&quot; слово...

Вызов статического метода
Доброго времени суток, господа! Метод вызывается так: class nameClass { public function metod($r) { // что-то тут... ...

Обращение из статического метода
Очень интересно вот что: В уроке 120 проекта startandroid есть статический метод в классе MyWidget, который обращается к не-статическим...

Поток из не статического метода
try{ _Running = true; iret = pthread_create(&amp;_ThreadRunClient, NULL, Run_Client, 0); ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача №1: при указании работ (справочник РаботыПоРемонтуСпецтехники),. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru