Есть ли способ перегрузить свойство в .NET.

Я сделал много перегрузки методов, но теперь у меня есть экземпляр, где я хотел бы перегрузить свойство. IDE в Visual Studio, похоже, разрешает это, так как я могу настроить две перегрузки, но я получаю сообщение об ошибке, потому что они отличаются только типом. Я думаю, что в моем синтаксисе отсутствует что-то?

Я хочу использовать два (или более) разных пользовательских класса в качестве свойства "Тип для моего".

Public Overloads Property myFlexibleProperty() As myCustomClass1
      Get
         Return _myFlexibleProperty1
      End Get
      Set(ByVal value As myCustomClass1)
         _myFlexibleProperty1 = value
      End Set
   End Property

   Public Overloads Property myFlexibleProperty() As myCustomClass2
      Get
         Return _myFlexibleProperty2
      End Get
      Set(ByVal value As myCustomClass2)
         _myFlexibleProperty2 = value
      End Set
   End Property

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

Ответ 1

Чтобы перегрузить что-то - метод или свойство - вам нужно принять другой набор параметров. Поскольку свойства в VB.NET могут принимать параметры, я думаю, вы можете перегрузить их; но они должны быть разными.

Итак, вы можете сделать это:

Public Overloads Readonly Property Average() As Double
Public Overloads Readonly Property Average(ByVal startIndex As Integer) As Double

Но не это:

Public Overloads Readonly Property Average() As Double
Public Overloads Readonly Property Average() As Decimal

Ответ 2

Это не должно быть возможным. Вы эффективно пытаетесь создать свойство, которое может возвращать два разных типа. Система не может определить, что вы пытаетесь вызвать.

Вам нужно будет дать уникальные имена свойств каждому.

Ответ 3

Ваши подписи одинаковы (только типы возврата отличаются). компилятор не знает, какой метод вы вызываете. Это твоя проблема. Измените подписи.

Ответ 4

Вы пытались использовать класс на основе интерфейса? Затем у вас могут быть разные классы на основе одного и того же общего интерфейса и свойства, связанного с типом интерфейса, а не с самим конкретным классом.

Ответ 5

Существует один способ

Public Enum myType
    inInteger = 0
    inDouble = 1
    inString = 2
End Enum

Public Class clsTest
Dim _Value1 As Integer
Dim _Value2 As Double
Dim _Value3 As String

Public Property MyValue(ByVal Typ As myType) As Object
    Get
        Select Case Typ
            Case myType.inDouble
                Return _Value2
            Case myType.inInteger
                Return _Value1
            Case Else
                Return _Value3
        End Select
    End Get
    Set(ByVal value As Object)
        Select Case Typ
            Case myType.inDouble
                _Value2 = value
            Case myType.inInteger
                _Value1 = value
            Case Else
                _Value3 = value
        End Select
    End Set
End Property
End Class

Ответ 6

Невозможно перегрузить свойства. При этом вы можете выполнить то, что хотите, создавая неявные преобразования или перегружая оператор =.

Ответ 7

Было бы возможно, чтобы свойство работало на каком-то специальном классе, который поддерживает расширение операторов преобразования к реальным типам интереса и к ним. В некоторых случаях это может работать достаточно хорошо и обеспечить полезное расширение. Самые большие ограничения:

  1. Если специальный класс /struct преобразуется в тип Object, он не будет вести себя как вещь, для которой он должен быть typecast.
  2. Если специальная вещь является классом, то каждый раз, когда свойство получает или задает свойство, потребуется создание нового объекта, собранного для мусора.

    Тем не менее, в некоторых случаях это может быть полезной абстракцией (особенно, если базовый тип будет структурой).