تعدد الأشكال في إطار الجهات الفاعلة الموثوقة

يسمح لك إطار عمل الجهات الفاعلة الموثوقة ببناء جهات فاعلة باستخدام العديد من التقنيات نفسها التي تستخدمها في التصميم الموجه للكائنات. واحدة من هذه التقنيات هي تعدد الأشكال، والذي يسمح للأنواع والواجهات بالوراثة من الآباء الأكثر عمومية. يتبع الميراث في إطار الجهات الفاعلة الموثوقة عموماً نموذج .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 الموجودة على نوع الجهة الفاعلة. تخبر هذه السمة إطار عمل الجهة الفاعلة الموثوق بها أنه يجب عليه إنشاء خدمة لاستضافة الجهات الفاعلة من هذا النوع تلقائياً. في بعض الحالات، قد ترغب في إنشاء نوع أساسي مخصص فقط لمشاركة الوظائف مع الأنواع الفرعية ولن يتم استخدامه أبداً لإنشاء مثيلاً لجهات فاعلة ملموسة. في هذه الحالات، يجب عليك استخدام الكلمة الرئيسية abstract للإشارة إلى أنك لن تنشئ جهةً فاعلةً أبداً بناءً على هذا النوع.

الخطوات التالية