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 obiektowo. 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, który ma zostać zaimplementowany przez typ aktora. Ten interfejs służy do generowania klasy proxy, która może być używana przez klientów do komunikowania się z twoimi aktorami. Interfejsy mogą dziedziczyć z innych interfejsów, o ile każdy interfejs implementowany przez typ aktora i wszyscy jego rodzice ostatecznie wywodzą się z interfejsu IActor (C#) lub Actor (Java). IActor(C#) i Actor(Java) to odpowiednio zdefiniowane przez platformę interfejsy podstawowe dla aktorów platformy .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żna mieć 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 typu aktora. Ten atrybut informuje framework Reliable Actor, że powinna automatycznie utworzyć usługę do hostowania aktorów tego typu. W niektórych przypadkach możesz utworzyć typ podstawowy przeznaczony wyłącznie do dzielenia się funkcjonalnością z podtypami, który nigdy nie będzie używany do tworzenia konkretnych instancji 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