Можно ли реализовать интерфейс через агрегатный / составной класс в vb.net? - PullRequest
1 голос
/ 30 марта 2010

VB.NET .NET 3.5

У меня есть агрегатный класс Package в составе системы доставки. Пакет содержит другой класс, BoxType. BoxType содержит информацию о ящике, используемом для доставки посылки, такую ​​как длина, ширина и т. Д. Ящика.

В пакете есть метод GetShippingRates. Этот метод вызывает отдельный вспомогательный класс ShipRater и передает сам пакет в качестве аргумента. ShipRater проверяет пакет, а также BoxType и возвращает список возможных тарифов / методов доставки.

Я хотел бы создать интерфейс IRateable, который будет предоставлен вспомогательному классу ShipRater. Так что вместо:

Class ShipRater
    Sub New(SomePackage as Package)
    End Sub
End Class

мы бы сделали:

 Class ShipRater
    Sub New(SomeThingRateable as IRateable)
    End Sub
End Class

Однако ShipRater требует информацию как от пакета, так и от его агрегата BoxType. Если я напишу интерфейс IRateable, то как я могу использовать свойства BoxType для реализации части интерфейса? Это возможно?

Ответы [ 2 ]

2 голосов
/ 30 марта 2010

Интерфейсу не нужно ничего знать о том, как вы агрегируете вызовы (можно предположить, что не все оцениваемые элементы должны объединять вызовы). Оставьте агрегацию (через делегирование) вызовов до Package:

Public Interface IRateable
    Function GetRate() As Double
End Interface

Public Class Package Implements IRateable
    Dim _boxType As New BoxType()

    'Rest of implementation'
    Public Function GetRate() As Double Implements IRateable.GetRate
        Return _boxType.Rate()
    End Function
End Class
0 голосов
/ 30 марта 2010

Конечно. Просто делегируйте необходимые вызовы на совокупный BoxType. Извините за C #:

class Package : IRateable
{
    private float weight;
    private BoxType box;

    Size IRateable.Dimensions
    {
        get { return box.Dimensions; }
    }

    float IRateable.Weight
    {
        get { return weight; }
    }
}
...