Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Наследование, struct / 25 сообщений из 36, страница 1 из 2
27.04.2010, 12:14
    #36600318
Naf
Naf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование, struct
а почему в C# нет наследования структур?

С уважением, Naf
...
Рейтинг: 0 / 0
27.04.2010, 12:19
    #36600350
ITmonstrik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование, struct
Naf,

Потому что это не ссылочный тип у которого есть свои преимущества и свои недостатки. Из разряда вопросов почему нет наследования int?
...
Рейтинг: 0 / 0
27.04.2010, 12:27
    #36600384
Naf
Naf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование, struct
ITmonstrikNaf,

Потому что это не ссылочный тип у которого есть свои преимущества и свои недостатки. Из разряда вопросов почему нет наследования int?Ага, но все же
...
Рейтинг: 0 / 0
27.04.2010, 12:34
    #36600414
Naf
Naf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование, struct
Было бы удобно в плане:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
struct A
{
    public int X;
}
struct B:A
{
    public int Y;
}
A a = new A();
a.X = 10;
B b = a;
b.X++;
//b.X равен 11 
//a.X равен 10 
...
Рейтинг: 0 / 0
27.04.2010, 12:43
    #36600432
comphead
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование, struct
NafБыло бы удобно в плане:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
struct A
{
    public int X;
}
struct B:A
{
    public int Y;
}
A a = new A();
a.X = 10;
B b = a;
b.X++;
//b.X равен 11 
//a.X равен 10 


чем для вас класс хуже?
то что он ссылочный и располагается в куче?
...
Рейтинг: 0 / 0
27.04.2010, 12:57
    #36600462
Naf
Naf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование, struct
comphead
чем для вас класс хуже?
то что он ссылочный и располагается в куче?
в классе будет:
Код: plaintext
1.
2.
//b.X равен 11 
//a.X равен 11, а мне нужно 10 
...
Рейтинг: 0 / 0
27.04.2010, 12:59
    #36600465
Naf
Naf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование, struct
а так приходится писать имплицит/эксплицит операторы
...
Рейтинг: 0 / 0
27.04.2010, 13:13
    #36600497
comphead
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование, struct
Nafа так приходится писать имплицит/эксплицит операторы

реализуйте интерфейс IClonealbe
...
Рейтинг: 0 / 0
27.04.2010, 13:15
    #36600502
Naf
Naf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование, struct
compheadреализуйте интерфейс IClonealbe
Это ничего не решит
...
Рейтинг: 0 / 0
27.04.2010, 13:17
    #36600507
Naf
Naf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование, struct
compheadNafа так приходится писать имплицит/эксплицит операторы
реализуйте интерфейс IClonealbe надо кучу кода писать ручками, да и возвращает он object
...
Рейтинг: 0 / 0
27.04.2010, 13:18
    #36600511
comphead
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование, struct
Nafcompheadреализуйте интерфейс IClonealbe
Это ничего не решит

может поподробнее расскажете о задаче.

Код: plaintext
1.
2.
3.
A a = new A();
a.X = 10;
B b = a.Clone();
b.X++;

a.X = 10;
b.X = 11;
...
Рейтинг: 0 / 0
27.04.2010, 13:20
    #36600517
Naf
Naf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование, struct
compheadNafcompheadреализуйте интерфейс IClonealbe
Это ничего не решит

может поподробнее расскажете о задаче.

Код: plaintext
1.
2.
3.
A a = new A();
a.X = 10;
B b = a.Clone();
b.X++;

a.X = 10;
b.X = 11;
Clone() надо еще ручками реализовать, да и возвращает он object
...
Рейтинг: 0 / 0
27.04.2010, 13:23
    #36600526
comphead
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование, struct
NafcompheadNafcompheadреализуйте интерфейс IClonealbe
Это ничего не решит

может поподробнее расскажете о задаче.

Код: plaintext
1.
2.
3.
A a = new A();
a.X = 10;
B b = a.Clone();
b.X++;

a.X = 10;
b.X = 11;
Clone() надо еще ручками реализовать, да и возвращает он object

разумеется. а в программировании все так. :)
ручками реализовывать то. )
...
Рейтинг: 0 / 0
27.04.2010, 13:25
    #36600532
Naf
Naf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование, struct
compheadNafcompheadNafcompheadреализуйте интерфейс IClonealbe
Это ничего не решит

может поподробнее расскажете о задаче.

Код: plaintext
1.
2.
3.
A a = new A();
a.X = 10;
B b = a.Clone();
b.X++;

a.X = 10;
b.X = 11;
Clone() надо еще ручками реализовать, да и возвращает он object

разумеется. а в программировании все так. :)
ручками реализовывать то. ) Хотелось бы по меньше такого кода
...
Рейтинг: 0 / 0
27.04.2010, 16:54
    #36601164
Gluck_13
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование, struct
comphead,

в "Framework Design Guidlines" можно прочесть следующие рекомендации:

DO NOT implement ICloneable
DO NOT use ICloneable in public APIs.

см. блог от автора:
http://blogs.msdn.com/brada/archive/2003/04/09/49935.aspx

рекомендуется реализовать собственную логику клонирования, не используя интерфейс ICloneable.
...
Рейтинг: 0 / 0
27.04.2010, 17:53
    #36601360
Gatman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование, struct
Nafа почему в C# нет наследования структур?

С уважением, Naf(неупакованная) структура не имеет ссылки на тип, поэтому в рантайме нельзя определить какого типа структура. т.к. структуры не наследуются, то компилятор всегда знает какой тип у конкретного экземпляра структуры
...
Рейтинг: 0 / 0
27.04.2010, 18:04
    #36601394
comphead
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование, struct
Gluck_13comphead,

в "Framework Design Guidlines" можно прочесть следующие рекомендации:

DO NOT implement ICloneable
DO NOT use ICloneable in public APIs.

см. блог от автора:
http://blogs.msdn.com/brada/archive/2003/04/09/49935.aspx

рекомендуется реализовать собственную логику клонирования, не используя интерфейс ICloneable.

да ну? и почему его нерекомендутся использовать?

точнее чем бы ваша логика клонирования отличалась бы?

переопределили метод Clone()
а дальше ваша логика.
так в чем смысл поста тогда?
...
Рейтинг: 0 / 0
28.04.2010, 07:44
    #36602025
Gluck_13
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование, struct
compheadда ну? и почему его нерекомендутся использовать?
Я давал ссылку на блог одного из авторов "Framework Design Guidlines", где описано, почему не рекомендуется и как надо. Кратко - контракт интерфейса ICloneable не определяет способа копирования - глубокое или поверхностное.
compheadточнее чем бы ваша логика клонирования отличалась бы?
Тем, что была бы определенной :)
compheadтак в чем смысл поста тогда?
Удержать топикстартера от сомнительных архитектурных решений.
...
Рейтинг: 0 / 0
28.04.2010, 10:15
    #36602226
comphead
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование, struct
Gluck_13compheadда ну? и почему его нерекомендутся использовать?
Я давал ссылку на блог одного из авторов "Framework Design Guidlines", где описано, почему не рекомендуется и как надо. Кратко - контракт интерфейса ICloneable не определяет способа копирования - глубокое или поверхностное.
compheadточнее чем бы ваша логика клонирования отличалась бы?
Тем, что была бы определенной :)
compheadтак в чем смысл поста тогда?
Удержать топикстартера от сомнительных архитектурных решений.

у вас есть пустая реализация метода.
хотите в нем реализуйте shallow copy хотите deep. или вы не совсем разобрались.

для именно той задачи, что хочет автор я пока путей кроме клонирования/копирования не вижу.
если вы видите, предложите.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
08.10.2014, 13:38
    #38770380
user7320
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование, struct
А как реализовать общую функциональность для структур, если без наследования?

Скажем, есть метод, который переводит любую структуру в массив байт через вызов метода Serialize этой структуры. Ну и плюс добавляет некоторые данные к этому массиву байт (код добавления этих данных всегда одинаковый и не зависит от типа входящей структуры). Ну и выдаёт массив байт в качестве возврата. Налицо одинаковая функциональность - как обобщить эту функциональность на все структуры, которые я хочу таким образом преобразовывать (т. е. на все структуры, которые могут приходить на вход вышеописанного метода)? Можно сделать перегрузки для каждого типа структур. Но тогда нужно будет копировать весь код в этих методах, и код одинаковым.


И ещё дополнительный вопрос. Почему в дотнете часто втречаются "семейства" методов вида

GetBytes(int x)
GetBytes(long x)
GetBytes(short x)
GetBytes(uint x)
GetBytes(ulong x)
GetBytes(ushort x)

и т. п., вместо одного

GetBytes<T>(T x)

? Не связано ли это с отсутствием наследования структур?
...
Рейтинг: 0 / 0
08.10.2014, 13:39
    #38770383
user7320
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование, struct
Может, переделать структуру в класс?
...
Рейтинг: 0 / 0
08.10.2014, 14:22
    #38770450
bazile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование, struct
user7320, раз речь о общем методе Serialize(), то сделай интерфейс с ним, добавь его ко всем структурам и напиши обобщенный метод с ограничением where T : struct, IMySerializable.

user7320Почему в дотнете часто втречаются "семейства" методов вида
Для обеспечения типовой безопасности (type safety) без изменений типов для которых эти методы предназначены. Также возможно что они были созданы в .NET 1.x когда обобщения еще не поддерживались.

user7320Может, переделать структуру в класс?
Структуру следует использовать для небольших значений с семантикой передачи по значению. Только тебе известно что нужно получить. Вот и решай.
...
Рейтинг: 0 / 0
08.10.2014, 14:40
    #38770470
user7320
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование, struct
bazileuser7320, раз речь о общем методе Serialize(), то сделай интерфейс с ним, добавь его ко всем структурам и напиши обобщенный метод с ограничением where T : struct, IMySerializable.
Под методом Serialize я имел ввиду статический метод - удобно вызывать эти методы (ещё и Deserialize есть) как статические. Тогда интерфейс не подойдёт. И класс не подойдёт - нельзя сделать статические методы абстрактными или виртуальными.

Похоже, надо выносить эту логику в отдельный класс-хелпер. Как вы думаете?
...
Рейтинг: 0 / 0
08.10.2014, 14:40
    #38770473
user7320
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование, struct
user7320И класс не подойдёт - нельзя сделать статические методы абстрактными или виртуальными.
Я имею ввиду, как базовый класс.
...
Рейтинг: 0 / 0
08.10.2014, 14:43
    #38770478
user7320
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование, struct
Вообще, непонятно, как в параметре метода указать, что тип этого параметра должен поддерживать такие-то СТАТИЧЕСКИЕ методы.
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Наследование, struct / 25 сообщений из 36, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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