@denismaster

Как сделать деконструктор класса?

Всем привет) Есть несколько классов:
public class A<TData>
{
  //header
  public string Signature {get;set;}
  public DateTime CreatedDate {get;set;}
  public int Version {get;set;}
  //data
  public TData Data {get;set;}
}

public class B<TData>
{
  //header
  public string Signature {get;set;}
  public DateTime CreatedDate {get;set;}
  public long AuthorId {get;set;}
  public string MagicString {get;set;}
  //data
  public TData Data {get;set;}
}


Как правильно создать иерархию классов и написать деконструкторы классов, чтобы можно было написать так:

A<string> first = new A<string>();
B<int> second = new B<int>();
//...
(var headerA, var dataA) = A;
// headerA содержит Signature, CreatedDate, Version
// dataA типа string
(var headerB, var dataB) = B;
// headerB содержит Signature, CreatedDate, AuthorId и MagicString
// dataB типа int
// headerA и headerB поле Data НЕ содержат


Деконструкторы - это функция void Deconstruct(out SomeClass1 s1, out SomeClass2 s2 ....)
  • Вопрос задан
  • 453 просмотра
Решения вопроса 1
@kttotto
пофиг на чем писать
Во первых не совсем понятно какой деструктор Вы хотите. Если такой как в С++, то в C# такого нет по причине существования GC. Если Вы хотите метод, который будет выполняться перед сборкой мусора, то нужно реализовать IDisposable. И даже если Вы явным образом вызовите Finalize, то в какой момент он выполнится, никто гарантии не даст, как GC решит.

Во вторых, C# язык строго типизированный, а значит нужно каким то образом ему понимать, какого типа будет headerA и headerB. Значит для них нужно определить тип
class HeaderA
{
      public string Signature {get;set;}
      public DateTime CreatedDate {get;set;}
      public int Version {get;set;}
}

class HeaderB
{
      public string Signature {get;set;}
      public DateTime CreatedDate {get;set;}
      public long AuthorId {get;set;}
      public string MagicString {get;set;}
}

затем инкапсулируете их
public class A<TData>
{
  //header
  public HeaderA Header {get;set;}
  //data
  public TData Data {get;set;}
}

public class B<TData>
{
  //header
  public HederB Header {get;set;}
  //data
  public TData Data {get;set;}
}

Видно, что можно еще обобщить и сделать
class HederData<THeder, TData>
{
      public THeder Header {get;set;}
      public TData Data {get;set;}
}

Теперь объекты можно создавать таким образом
var a = new DataHaeder<HeaderA, string>();
var b = new DataHeader<HeaderB, int>();

Ну вот собственно мы и получили объект с полями, какими Вы хотите
(var headerA, dataA)
a.Header и a.Data, b.Header и b.Data;

И, кстати, общие поля можно вынести в один класс
class CommonProp
{
      public string Signature {get;set;}
      public DateTime CreatedDate {get;set;}
}

А потом хедеры от него отнаследуйте.
class HeaderA : CommonProp
{
      public int Version {get;set;}
}

class HeaderB : CommonProp
{
      public long AuthorId {get;set;}
      public string MagicString {get;set;}
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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