Sdílet prostřednictvím


Polymorfismus v rámci Reliable Actors

Architektura Reliable Actors umožňuje vytvářet aktéry pomocí mnoha stejných technik, které byste použili v objektově orientovaném návrhu. Jednou z těchto technik je polymorfismus, který umožňuje, aby typy a rozhraní dědily z obecnějších nadřazených prvků. Dědičnost v rozhraní Reliable Actors se obecně řídí modelem .NET s několika dalšími omezeními. V případě Javy/Linuxu se řídí modelem Java.

Rozhraní

Architektura Reliable Actors vyžaduje, abyste definovali aspoň jedno rozhraní, které má být implementováno typem objektu actor. Toto rozhraní slouží ke generování třídy proxy, kterou můžou klienti použít ke komunikaci s vašimi aktéry. Rozhraní mohou dědit z jiných rozhraní, pokud každé rozhraní implementované typem objektu actor a všechny jeho nadřazené objekty nakonec odvozeny od IActor(C#) nebo Actor(Java) . IActor(C#) a Actor(Java) jsou základní rozhraní definovaná platformou pro aktéry v rozhraních .NET a Java. Klasický příklad polymorfismu při použití obrazců proto může vypadat nějak takto:

Hierarchie rozhraní pro aktéry obrazců

Typy

Můžete také vytvořit hierarchii typů objektů actor, které jsou odvozeny od základní třídy Actor, která je poskytována platformou. V případě obrazců můžete mít základní Shapetyp (C#) nebo 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 jazyka Shape(C#) nebo ShapeImpl(Java) můžou přepsat metody ze základu.

[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;
        }));
    }
}

Poznamenejte si ActorService atribut typu objektu actor. Tento atribut říká rozhraní Reliable Actor, že by měl automaticky vytvořit službu pro hostování herců tohoto typu. V některýchpřípadechchm objektům můžete v některých případech V takových případech byste měli použít abstract klíčové slovo k označení, že na základě tohoto typu nikdy nevytvoříte objekt actor.

Další kroky