Misma propiedad, diferentes tipos
-
03-07-2019 - |
Pregunta
Digamos que tienes una clase con una propiedad Uri. ¿Hay alguna manera de hacer que esa propiedad acepte tanto un valor de cadena como un Uri? ¿Cómo lo construirías?
Me gustaría poder hacer algo como uno de los siguientes, pero ninguno de ellos es compatible (usando VB, ya que le permite especificar el tipo en la declaración de conjunto para el segundo):
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
Dado que probablemente no se admitirán pronto, ¿de qué otra manera podría manejar esto? Estoy buscando algo un poco mejor que simplemente proporcionar un método adicional de .SetLink (valor de cadena)
, y todavía estoy en .Net2.0 (aunque si las versiones posteriores tienen una buena característica para esto , Me gustaría saberlo).
Puedo pensar en otros escenarios en los que es posible que desees proporcionar este tipo de sobrecarga: una clase con un miembro de SqlConnection que te permite establecer una nueva conexión o una nueva cadena de conexión, por ejemplo.
Solución
Como alternativa, puede, por supuesto, evitar la sobrecarga y simplemente nombrar las propiedades de forma adecuada:
Public WriteOnly Property UriString() As String
Set(ByVal value As String)
m_Uri = new Uri(value)
End Set
End Property
Por supuesto, no tiene que hacer este WriteOnly
pero parece apropiado.
Otros consejos
Creo que solo necesitas proporcionar un acompañamiento
Public Sub SetLink(ByVal value as String)
_link = new Uri(value)
End Sub
No hay nada mejor, AFAIK.
Digamos que tienes una clase con una propiedad Uri. ¿Hay alguna forma de hacer que esa propiedad acepte tanto un valor de cadena como un Uri?
No, porque esto significaría tener dos captadores que varían solo en su tipo de devolución y esto no está permitido en .NET.
Usaré el método Uri
exclusivamente y tal vez crearé un método conveniente para establecer la propiedad URI
, dada una cadena. Sin embargo, dado que la conversión de String
a URI
es sencilla, incluso esto podría no ser necesario.
No puede tener una propiedad como esa, pero puede crear dos propiedades que manipulen el mismo campo subyacente, al igual que Altura / Ancho / Tamaño en los formularios Windows Forms.