Поделиться через


Полиморфизм в платформе Надежных субъектов

Платформа Reliable Actors позволяет создавать субъекты, используя многие из одних и то же методов, которые вы будете использовать в объектно-ориентированном дизайне. Одним из этих методов является полиморфизм, который позволяет типам и интерфейсам наследовать от более обобщенных родителей. Наследование в платформе Надежных субъектов обычно следует модели .NET с несколькими дополнительными ограничениями. В случае Java/Linux он следует модели Java.

Интерфейсы

Платформа Надежных субъектов требует определить по крайней мере один интерфейс, который будет реализован типом субъекта. Этот интерфейс используется для создания прокси-класса, который может использоваться клиентами для взаимодействия с актерами. Интерфейсы могут наследоваться от других интерфейсов, если каждый интерфейс, реализуемый типом актера, и все его предки в конечном итоге являются производными от IActor(C#) или Actor(Java). IActor(C#) и Actor(Java) — это платформенные базовые интерфейсы для субъектов в платформах .NET и Java соответственно. Таким образом, классический пример полиморфизма с использованием фигур может выглядеть примерно так:

Иерархия интерфейсов для субъектов фигур

Типы

Вы также можете создать иерархию типов субъектов, производных от базового класса Субъекта, предоставляемого платформой. В случае фигур может быть базовый Shapeтип (C#), или 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();
}

Подтипы Shape(C#) или ShapeImpl(Java) могут переопределять методы из базы.

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

Обратите внимание на атрибут ActorService типа актера. Этот атрибут сообщает платформе Reliable Actor, что она должна автоматически создать службу для размещения субъектов этого типа. В некоторых случаях может потребоваться создать базовый тип, который предназначен исключительно для совместного использования функций с подтипами и никогда не будет использоваться для создания экземпляров конкретных субъектов. В этих случаях следует использовать ключевое слово abstract, указывающее, что вы никогда не создадите актера на основе этого типа.

Дальнейшие действия