Как определить литого оператора в супер класс в C # 3.5?

StackOverflow https://stackoverflow.com/questions/3883757

  •  28-09-2019
  •  | 
  •  

Вопрос

У меня есть класс контейнеров для добавления некоторых свойств в стандартные типы данных, таких как 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
    }
  }

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

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

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

Runnable по минимальному коду в подкладках?

Это было полезно?

Решение

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top