共用方式為


Reliable Actors 架構中的多型

Reliable Actors 架構可讓您使用許多您會在物件導向設計中使用的相同技巧來建置動作項目。 這些技巧的其中之一就是多型,此技巧允許從更一般化的父系繼承類型和介面。 Reliable Actors 架構中的繼承通常會遵循 .NET 模型,但有幾個額外的條件約束。 針對 Java/Linux,它會遵循 Java 模型。

介面

Reliable Actors 架構會要求您至少定義一個要由動作項目類型實作的介面。 此介面會用來產生可供用戶端用來與您的動作項目進行通訊的 Proxy 類別。 只要動作項目類型及其所有父系所實作的每個介面最終都是衍生自 IActor(C#) 或 Actor(Java),這些介面便可以從其他介面繼承。 IActor(C#) 和 Actor(Java) 分別是針對 .NET 和 Java 架構中動作項目的平台定義基底介面。 因此,使用圖形的傳統多型範例可能會看起來像這樣:

Interface hierarchy for shape actors

類型

您也可以建立衍生自平台所提供之基底「動作項目」類別的動作項目類型階層。 如果是圖形,您可能會有一個基底 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 關鍵字來指出您永遠不會根據該類型建立動作項目。

下一步