powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Наследование, struct
36 сообщений из 36, показаны все 2 страниц
Наследование, struct
    #36600318
Naf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а почему в C# нет наследования структур?

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

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

Потому что это не ссылочный тип у которого есть свои преимущества и свои недостатки. Из разряда вопросов почему нет наследования int?Ага, но все же
...
Рейтинг: 0 / 0
Наследование, struct
    #36600414
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
Наследование, struct
    #36600432
comphead
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Наследование, struct
    #36600462
Naf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
comphead
чем для вас класс хуже?
то что он ссылочный и располагается в куче?
в классе будет:
Код: plaintext
1.
2.
//b.X равен 11 
//a.X равен 11, а мне нужно 10 
...
Рейтинг: 0 / 0
Наследование, struct
    #36600465
Naf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а так приходится писать имплицит/эксплицит операторы
...
Рейтинг: 0 / 0
Наследование, struct
    #36600497
comphead
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nafа так приходится писать имплицит/эксплицит операторы

реализуйте интерфейс IClonealbe
...
Рейтинг: 0 / 0
Наследование, struct
    #36600502
Naf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
compheadреализуйте интерфейс IClonealbe
Это ничего не решит
...
Рейтинг: 0 / 0
Наследование, struct
    #36600507
Naf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
compheadNafа так приходится писать имплицит/эксплицит операторы
реализуйте интерфейс IClonealbe надо кучу кода писать ручками, да и возвращает он object
...
Рейтинг: 0 / 0
Наследование, struct
    #36600511
comphead
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Наследование, struct
    #36600517
Naf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Наследование, struct
    #36600526
comphead
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Наследование, struct
    #36600532
Naf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Наследование, struct
    #36601164
Gluck_13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Наследование, struct
    #36601360
Gatman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nafа почему в C# нет наследования структур?

С уважением, Naf(неупакованная) структура не имеет ссылки на тип, поэтому в рантайме нельзя определить какого типа структура. т.к. структуры не наследуются, то компилятор всегда знает какой тип у конкретного экземпляра структуры
...
Рейтинг: 0 / 0
Наследование, struct
    #36601394
comphead
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Наследование, struct
    #36602025
Gluck_13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
compheadда ну? и почему его нерекомендутся использовать?
Я давал ссылку на блог одного из авторов "Framework Design Guidlines", где описано, почему не рекомендуется и как надо. Кратко - контракт интерфейса ICloneable не определяет способа копирования - глубокое или поверхностное.
compheadточнее чем бы ваша логика клонирования отличалась бы?
Тем, что была бы определенной :)
compheadтак в чем смысл поста тогда?
Удержать топикстартера от сомнительных архитектурных решений.
...
Рейтинг: 0 / 0
Наследование, struct
    #36602226
comphead
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gluck_13compheadда ну? и почему его нерекомендутся использовать?
Я давал ссылку на блог одного из авторов "Framework Design Guidlines", где описано, почему не рекомендуется и как надо. Кратко - контракт интерфейса ICloneable не определяет способа копирования - глубокое или поверхностное.
compheadточнее чем бы ваша логика клонирования отличалась бы?
Тем, что была бы определенной :)
compheadтак в чем смысл поста тогда?
Удержать топикстартера от сомнительных архитектурных решений.

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

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

Скажем, есть метод, который переводит любую структуру в массив байт через вызов метода 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
Наследование, struct
    #38770383
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может, переделать структуру в класс?
...
Рейтинг: 0 / 0
Наследование, struct
    #38770450
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320, раз речь о общем методе Serialize(), то сделай интерфейс с ним, добавь его ко всем структурам и напиши обобщенный метод с ограничением where T : struct, IMySerializable.

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

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

Похоже, надо выносить эту логику в отдельный класс-хелпер. Как вы думаете?
...
Рейтинг: 0 / 0
Наследование, struct
    #38770473
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320И класс не подойдёт - нельзя сделать статические методы абстрактными или виртуальными.
Я имею ввиду, как базовый класс.
...
Рейтинг: 0 / 0
Наследование, struct
    #38770478
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще, непонятно, как в параметре метода указать, что тип этого параметра должен поддерживать такие-то СТАТИЧЕСКИЕ методы.
...
Рейтинг: 0 / 0
Наследование, struct
    #38770480
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все эти type constraints и прочие наследования, абстрактнось и виртуальность влияют только на методы экземпляра, но не на методы типа.
...
Рейтинг: 0 / 0
Наследование, struct
    #38770493
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Похоже, что только либо через рефлексию, либо так .
...
Рейтинг: 0 / 0
Наследование, struct
    #38770500
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно сделать интерфейс пустым чтобы он выполнял роль маркера и оформить код примерно так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
interface IMySerializable {}

struct S1 : IMySerializable {}
struct S2 : IMySerializable {}
struct S3 { }

static class SerializationHelper
{
	public static byte[] Serialize<T>(T val) where T : struct, IMySerializable
	{
		...
	}
	
	public static T Deserialize<T>(byte[] data) where T : struct, IMySerializable
	{
		...
	}
}


Код: c#
1.
2.
3.
4.
SerializationHelper.Serialize(new S1());
SerializationHelper.Serialize(new S2());
SerializationHelper.Serialize(new S3()); // ошибка компиляции
SerializationHelper.Serialize(10); // ошибка компиляции



user7320Вообще, непонятно, как в параметре метода указать, что тип этого параметра должен поддерживать такие-то СТАТИЧЕСКИЕ методы.
Никак.
...
Рейтинг: 0 / 0
Наследование, struct
    #38770514
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bazileМожно сделать интерфейс пустым чтобы он выполнял роль маркера и оформить код примерно так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
interface IMySerializable {}

struct S1 : IMySerializable {}
struct S2 : IMySerializable {}
struct S3 { }

static class SerializationHelper
{
	public static byte[] Serialize<T>(T val) where T : struct, IMySerializable
	{
		...
	}
	
	public static T Deserialize<T>(byte[] data) where T : struct, IMySerializable
	{
		...
	}
}


Код: c#
1.
2.
3.
4.
SerializationHelper.Serialize(new S1());
SerializationHelper.Serialize(new S2());
SerializationHelper.Serialize(new S3()); // ошибка компиляции
SerializationHelper.Serialize(10); // ошибка компиляции


Нет, что-то не то у вас.

У меня УЖЕ ЕСТЬ методы сериализации и десериализации для всех моих структур. И эти методы выполняются по-разному для каждой такой структуры. Они только имеют одинаковую сигнатуру. Теперь мне надо сделать одинаковые дествия, включая вызов метода Serialize, например, в другом методе другого класса. Т. е. примерно так:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
private byte[] SendData(Struct1 obj)
{
    byte[] result = Struct1.Serialize();
    
    // Что-то делаем с result...
    
    return result;
}

private byte[] SendData(Struct2 obj)
{
    byte[] result = Struct2.Serialize();
    
    // Что-то делаем с result...
    
    return result;
}



И я хочу, чтобы весь одинаковый (кроме вызовов Serialize) код был не разбросан по куче перегрузок метода SendData, а как-то обобщён в одном методе.
...
Рейтинг: 0 / 0
Наследование, struct
    #38770517
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поправка, везде

StructN.Serialize();

заменить на

StructN.Serialize(obj);
...
Рейтинг: 0 / 0
Наследование, struct
    #38770521
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот так

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
private byte[] SendData(Struct1 obj)
{
    byte[] result = Struct1.Serialize(obj);
    
    // Что-то делаем с result...
    
    return result;
}

private byte[] SendData(Struct2 obj)
{
    byte[] result = Struct2.Serialize(obj);
    
    // Что-то делаем с result...
    
    return result;
}
...
Рейтинг: 0 / 0
Наследование, struct
    #38770526
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кажется, я туплю )))

Вот же!

private byte[] SendData(byte[] structAsBytes)
...
Рейтинг: 0 / 0
Наследование, struct
    #38770530
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но штука в том, что хотелось бы именно ограничить, чтобы на вход SendData приходили данные только от определённого списка структур.
...
Рейтинг: 0 / 0
Наследование, struct
    #38771523
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
  public interface IMarker
        { }
        public struct Struct1:IMarker
        {
            public static byte[] Serialize(Struct1 s)
            {
                return new byte[0];
            }
        }
        static byte[] SendData(IMarker stru)
        {
           var res = stru.GetType().InvokeMember("Serialize", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static| System.Reflection.BindingFlags.InvokeMethod, null, null, new object[] { stru });
           return res as byte[];
        }


Код: c#
1.
2.
3.
4.
5.
6.
   static void Main(string[] args)
        {
            Struct1 s = default(Struct1);
            var res = SendData(s);
            Console.ReadLine();
        }
...
Рейтинг: 0 / 0
Наследование, struct
    #38771588
user7320
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВ
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
  public interface IMarker
        { }
        public struct Struct1:IMarker
        {
            public static byte[] Serialize(Struct1 s)
            {
                return new byte[0];
            }
        }
        static byte[] SendData(IMarker stru)
        {
           var res = stru.GetType().InvokeMember("Serialize", System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static| System.Reflection.BindingFlags.InvokeMethod, null, null, new object[] { stru });
           return res as byte[];
        }


Код: c#
1.
2.
3.
4.
5.
6.
   static void Main(string[] args)
        {
            Struct1 s = default(Struct1);
            var res = SendData(s);
            Console.ReadLine();
        }


Ну, что через рефлексию можно - это-то понятно. Хотелось бы без неё, средствами чисто языка, без "хаков".

Всё равно спасибо за конкретный пример.
...
Рейтинг: 0 / 0
Наследование, struct
    #38772287
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user7320, вот еще конкретный пример:
Код: 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.
public interface IMySerializable<T> where T : struct, IMySerializable<T>
{
	byte[] Serialize();
	T Deserialize(byte[] data);
}

struct S1 : IMySerializable<S1>
{
	public byte[] Serialize()
	{
		...
	}
	
	public S1 Deserialize(byte[] data)
	{
		...
	}
}

public void SendData<T>(T toSend)
	where T : struct, IMySerializable<T>
{
	byte[] data = toSend.Serialize();
	SendData(data);
}

private void SendData(byte[] data)
{
}

....

S1 s1 = new S1();
SendData(s1); // ok
SendData(DateTime.Now); // ошибка компиляции
...
Рейтинг: 0 / 0
36 сообщений из 36, показаны все 2 страниц
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Наследование, struct
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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