Udostępnij za pośrednictwem


Polimorfizm w strukturze Reliable Actors

Struktura Reliable Actors umożliwia tworzenie aktorów przy użyciu wielu tych samych technik, których można użyć w projekcie zorientowanym na obiekty. Jedną z tych technik jest polimorfizm, który umożliwia dziedziczenie typów i interfejsów z bardziej uogólnionych elementów nadrzędnych. Dziedziczenie w strukturze Reliable Actors zwykle jest zgodne z modelem platformy .NET z kilkoma dodatkowymi ograniczeniami. W przypadku języka Java/Linux jest zgodny z modelem Java.

Interfejsy

Struktura Reliable Actors wymaga zdefiniowania co najmniej jednego interfejsu do zaimplementowania przez typ aktora. Ten interfejs służy do generowania klasy serwera proxy, która może być używana przez klientów do komunikowania się z aktorami. Interfejsy mogą dziedziczyć z innych interfejsów, o ile każdy interfejs implementowany przez typ aktora i wszystkie jego elementy nadrzędne ostatecznie pochodzą z IActor(C#) lub Actor(Java) . IActor(C#) i Actor(Java) to odpowiednio interfejsy podstawowe zdefiniowane przez platformę dla aktorów w platformach .NET i Java. W związku z tym klasyczny przykład polimorfizmu przy użyciu kształtów może wyglądać mniej więcej tak:

Hierarchia interfejsu dla aktorów kształtów

Typy

Można również utworzyć hierarchię typów aktorów, które pochodzą z podstawowej klasy aktora udostępnianej przez platformę. W przypadku kształtów może istnieć typ podstawowy Shape(C#) lub ShapeImpl(Java):

public abstract class Shape : Actor, IShape
{
    public abstract Task<int> GetVerticeCount();

    public abstract Task<double> GetAreaAsync();
}
public abstract class ShapeImpl extends FabricActor implements Shape
{
    public abstract CompletableFuture<int> getVerticeCount();

    public abstract CompletableFuture<double> getAreaAsync();
}

Podtypy Shape(C#) lub ShapeImpl(Java) mogą zastąpić metody z bazy.

[ActorService(Name = "Circle")]
[StatePersistence(StatePersistence.Persisted)]
public class Circle : Shape, ICircle
{
    public override Task<int> GetVerticeCount()
    {
        return Task.FromResult(0);
    }

    public override async Task<double> GetAreaAsync()
    {
        CircleState state = await this.StateManager.GetStateAsync<CircleState>("circle");

        return Math.PI *
            state.Radius *
            state.Radius;
    }
}
@ActorServiceAttribute(name = "Circle")
@StatePersistenceAttribute(statePersistence = StatePersistence.Persisted)
public class Circle extends ShapeImpl implements Circle
{
    @Override
    public CompletableFuture<Integer> getVerticeCount()
    {
        return CompletableFuture.completedFuture(0);
    }

    @Override
    public CompletableFuture<Double> getAreaAsync()
    {
        return (this.stateManager().getStateAsync<CircleState>("circle").thenApply(state->{
          return Math.PI * state.radius * state.radius;
        }));
    }
}

Zanotuj ActorService atrybut w typie aktora. Ten atrybut informuje platformę Reliable Actors, że powinna automatycznie utworzyć usługę do hostowania aktorów tego typu. W niektórych przypadkach możesz utworzyć typ podstawowy, który jest przeznaczony wyłącznie do udostępniania funkcji z podtypami i nigdy nie będzie używany do tworzenia wystąpień konkretnych aktorów. W takich przypadkach należy użyć słowa kluczowego abstract , aby wskazać, że nigdy nie utworzysz aktora na podstawie tego typu.

Następne kroki