AlexXYZ
@AlexXYZ
O Keep Clear O

Можно ли создать в C# иерархический класс?

Всем привет. Немного странный вопрос, с учётом того, что что такое класс я всё-таки знаю. Но может можно придумать какой-то приём, чтобы создавать вложенные свойства класса на подобие JSON объектов с вложенными свойствами и не плодить сущности? Например, вот пара приёмов - можно объявлять кортежи свойств класса:
public class CLS1{
        
        public struct STR {
            public int x;
            public int y;
            public int z;
            public (int a, int b, int c) obj; // <<<<<<< - кортежи как свойство
            public struct STR2 {
                public string namemm;
            }
            public STR2 lv2;
        };
        public STR val1;
    }

Но у кортежей есть недостаток - их нельзя нормально рефакторить (Ctrl-RR и всё такое). Ещё вариант - объявить вложенный struct, т.к. он valued, и его уже можно рефакторить. Но это как раз уже сущность, использование которой я и пытаюсь избежать. Вложенный класс совсем не вариант, потому что его надо инициализировать.

Есть ещё какие-то варианты ?

P.S.
Не спрашивайте почему, просто идея засела в голове. Фактически я не вижу противоречия, чтобы иметь иерархию в классе. Пока вижу только синтаксическое ограничение решения "в лоб".
  • Вопрос задан
  • 159 просмотров
Пригласить эксперта
Ответы на вопрос 5
vabka
@vabka Куратор тега C#
Токсичный шарпист
То что вы описываете сделать нельзя.
Не вижу проблем с инициализацией вложенных классов или использования структур.
Большие кортежи - это плохо. Кортежи в публичных свойствах - тоже не желательно.
Ответ написан
NeiroNx
@NeiroNx
Программист
я использовал Dictionary<string, dynamic> можно вкладывать сколько хочется. dynamic - подразумевает любой тип, сериализуется вроде нормально если без извратов - всякие strintg, double, int, bool. Насчет датывремени не факт - но стоит попробовать.

Но это я использовал чисто чтобы построить структуру JSON для выдачи динамических данных. Для читаемости кода лучше использовать классы.
Ответ написан
HemulGM
@HemulGM
Delphi Developer, сис. админ
Могу скинуть пример на Delphi
type
  TMyClass1 = class
    type
      TProperties = class
        type
          TMeasure = class
            Size: TSize;
          end;
      public
        Measure: TMeasure;
      end;
  public
    Properties: TProperties;
    constructor Create;
  end;

  TMyClass2 = class
    Properties: record
      Measure: record
        Size: TSize;
      end;
    end;
  end;

procedure TForm14.FormCreate(Sender: TObject);
begin
  var MyItem := TMyClass1.Create;
  MyItem.Properties.Measure.Size := TSize.Create(0, 0);

  var MyItem2: TMyClass2;
  MyItem2.Properties.Measure.Size := TSize.Create(0, 0);
end;

{ TMyClass1 }

constructor TMyClass1.Create;
begin
  Properties := TMyClass1.TProperties.Create;
  Properties.Measure := TMyClass1.TProperties.TMeasure.Create;
end;
Ответ написан
@cicatrix
было бы большой ошибкой думать
А может с конца начать. Можете обрисовать ситуацию, когда это может понадобиться? Ну или хотя бы псевдокодом описать?
Просто есть такое чувство, что либо я чего-то недопонимаю, либо подобный приём наружает с пяток различных паттернов, которых рекомендуется придерживаться.
И уж совсем не вижу проблемы в том, что вложенный класс надо инициализировать.
Ответ написан
yarosroman
@yarosroman Куратор тега C#
C# the best
Только это ничем не отличается от
public struct STR2 {
     public string namemm;
};

public struct STR {
    public int x;
    public int y;
    public int z;
    public (int a, int b, int c) obj; // <<<<<<< - кортежи как свойство
    public STR2 lv2;
};

public class CLS1{
     public STR val1;
}


Объявлять публичный тип внутри другого, а зачем?
Долго догонял ваш вопрос, потом понял.

Второе, строгая типизация, накладывает свои ограничения и каждый тип надо описывать явно. в C# есть анонимные типы, отчасти похоже что вы хотите, https://docs.microsoft.com/ru-ru/dotnet/csharp/pro.... Динамическая же, позволяет делать как вам удобно, но не дает контроля над кодом.

Третье, есть вариант использование генераторов исходного кода, которые появились в dotnet с год назад.

Четвертое, а в чем проблема с инициализацией класса? да значимые типы инициализируются значениями по умолчанию, просто за вас это dotnet делает, в отличии от C++, который просто память на стеке выделяет, и пофиг, что там лежит. Ну сделайте конструктор по умолчанию, который будет делать инициализацию вам.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы