Есть ли способ перегрузить свойство в .NET - PullRequest
14 голосов
/ 10 февраля 2010

Я сделал много перегрузок метода, но теперь у меня есть экземпляр, где я хотел бы перегрузить свойство. Среда 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 позволяет мне делать, я начинаю думать, что это невозможно?

Ответы [ 7 ]

18 голосов
/ 10 февраля 2010

To overload что-то - метод или свойство - вам нужно, чтобы оно приняло другой набор параметров Поскольку свойства в 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 голосов
/ 10 февраля 2010

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

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

1 голос
/ 07 мая 2011

Есть один путь

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
1 голос
/ 10 февраля 2010

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

1 голос
/ 10 февраля 2010

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

0 голосов
/ 26 января 2011

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

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

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

0 голосов
/ 10 февраля 2010

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

...