Как определить оператор приведения в суперклассе в C # 3.5? - PullRequest
4 голосов
/ 07 октября 2010

У меня есть контейнерный класс для добавления некоторых свойств к стандартным типам данных, таким как int, string и так далее. Этот контейнерный класс инкапсулирует объект такого объекта (стандартного типа). Другие классы затем используют подклассы класса контейнера для получения / установки добавленных свойств. Теперь я хочу, чтобы подклассы могли неявно приводить между своими инкапсулированными объектами и самим собой без дополнительного кода.

Вот упрощенный пример моих занятий:

  // Container class that encapsulates strings and adds property ToBeChecked
  // and should define the cast operators for sub classes, too.
  internal class StringContainer
  {
    protected string _str;

    public bool ToBeChecked { get; set; }

    public static implicit operator StringContainer(string str)
    {
      return new StringContainer { _str = str };
    }

    public static implicit operator string(StringContainer container)
    {
      return (container != null) ? container._str : null;
    }
  }

  // An example of many sub classes. Its code should be as short as possible.
  internal class SubClass : StringContainer
  {
    // I want to avoid following cast operator definition
    //    public static implicit operator SubClass(string obj)
    //    {
    //      return new SubClass() { _str = obj };
    //    }
  }

  // Short code to demosntrate the usings of the implicit casts.
  internal class MainClass
  {
    private static void Main(string[] args)
    {
      SubClass subClass = "test string"; // ERROR: Cannot convert source type 'string' to 'SubClass'

      string testString = subClass; // No error
    }
  }

Мой реальный контейнерный класс имеет два параметра типа, один для типа инкапсулированного объекта (string, int, ...) и второй для типа подкласса (например, SubClass).

Как я могу сделать код

SubClass subClass = "test string"; // ERROR: Cannot convert source type 'string' to 'SubClass'

запускается минимальным кодом в подклассах?

1 Ответ

1 голос
/ 07 октября 2010

Я не думаю, что есть способ определить оператор преобразования в базовом классе.

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

Возможно, вы могли бы использовать другой способ параметризации типа StringContainer. Например, вместо использования наследования реализации (подклассы), вы могли бы вместо этого передать некоторые функции (делегаты типа Func<...>) классу StringContainer. Таким образом, пользователь может параметризовать класс, и ваше неявное преобразование все равно будет работать.

...