То же свойство, разные типы - PullRequest
3 голосов
/ 02 октября 2008

Допустим, у вас есть класс со свойством Uri. Есть ли способ заставить это свойство принимать как строковое значение, так и Uri? Как бы вы его построили?

Я хотел бы иметь возможность сделать что-то подобное одному из следующих, но ни одно из них не поддерживается (с использованием VB, поскольку оно позволяет вам указать тип в объявлении Set для второго):

Class MyClass

    Private _link As Uri

   'Option 1: overloaded property
    Public Property Link1 As Uri
        Get
            return _link
        End Get
        Set(ByVal value As Uri)
           _link = value
        End Set
    End Property

    Public Property link1 As String
        Get
            return _link.ToString()
        End Get
        Set(Byval value As String)
           _link = new Uri(value)
        End Set
   End Property

   ' Option 2: Overloaded setter
   Public Property link2 As Uri
      Get
          return _link
      End Get
      Set(Byval value As Uri)
          _link = value
      End Set
      Set(Byval value As String)
          _link = new Uri(value)
      End Set
End Class

Учитывая, что они, вероятно, не будут поддерживаться в ближайшее время, как еще вы справитесь с этим? Я ищу что-то более приятное, чем просто предоставление дополнительного метода .SetLink(string value), и я все еще на .Net2.0 (хотя, если в более поздних версиях есть хорошая функция для этого, я хотел бы услышать об этом) .

Я могу подумать о других сценариях, в которых вы можете захотеть обеспечить такой вид перегрузки: класс с членом SqlConnection, который позволяет вам установить, например, новое соединение или новую строку соединения.

Ответы [ 4 ]

3 голосов
/ 02 октября 2008

В качестве альтернативы вы можете, конечно, отказаться от перегрузки и просто назвать свойства соответствующим образом:

Public WriteOnly Property UriString() As String
    Set(ByVal value As String)
        m_Uri = new Uri(value)
    End Set
End Property

Конечно, вам не нужно делать это WriteOnly, но это кажется уместным.

3 голосов
/ 02 октября 2008

Я думаю, вам просто нужно предоставить сопровождающий

Public Sub SetLink(ByVal value as String)
    _link = new Uri(value)
End Sub

Ничего приятного нет, AFAIK.

1 голос
/ 02 октября 2008

У вас не может быть одного такого свойства, но вы можете создать два свойства, которые оба манипулируют одним и тем же базовым полем - точно так же, как Height / Width / Size в Windows Forms.

1 голос
/ 02 октября 2008

Допустим, у вас есть класс со свойством Uri. Есть ли способ заставить это свойство принимать как строковое значение, так и Uri?

Нет, потому что это будет означать наличие двух методов получения, которые различаются только по типу возвращаемого значения, а в .NET это не разрешено.

Я бы использовал исключительно метод Uri и, возможно, создал бы метод convienenec для установки свойства URI для заданной строки. Однако, поскольку преобразование из String в URI является простым, даже это может быть ненужным.

...