Saltearse al contenido

Interfaces

interface IAddressProvider
{
procedure GetAddress(): Text;
}
codeunit 65100 CompanyAddressProvider implements IAddressProvider
{
procedure GetAddress(): Text;
begin
exit('Company address \ Denmark 2800')
end;
}
codeunit 65101 PrivateAddressProvider implements IAddressProvider
{
procedure GetAddress(): Text;
begin
exit('My Home address \ Denmark 2800')
end;
}
page 65100 MyAddress
{
PageType = Card;
ApplicationArea = All;
UsageCategory = Administration;
layout
{
area(Content)
{
group(GroupName)
{
}
}
}
actions
{
area(Processing)
{
action(WhatsTheAddress)
{
ApplicationArea = All;
Caption = 'What's the Address?';
ToolTip = 'Select the address.';
Image = Addresses;
trigger OnAction()
var
iAddressProvider: Interface IAddressProvider;
begin
AddressproviderFactory(iAddressProvider);
Message(iAddressProvider.GetAddress());
end;
}
action(SendToHome)
{
ApplicationArea = All;
Image = Home;
Caption = 'Send to Home.';
ToolTip = 'Set the interface implementation to Home.';
trigger OnAction()
begin
sendTo := sendTo::Private
end;
}
action(SendToWork)
{
Image = WorkCenter;
Caption = 'Send to Work.';
ToolTip = 'Set the interface implementation to Work.';
ApplicationArea = All;
trigger OnAction()
begin
sendTo := sendTo::Company
end;
}
}
}
local procedure AddressproviderFactory(var iAddressProvider: Interface IAddressProvider)
var
CompanyAddressProvider: Codeunit CompanyAddressProvider;
PrivateAddressProvider: Codeunit PrivateAddressProvider;
begin
if sendTo = sendTo::Company then
iAddressProvider := CompanyAddressProvider;
if sendTo = sendTo::Private then
iAddressProvider := PrivateAddressProvider;
end;
var
sendTo: enum SendTo;
}
enum 65100 SendTo
{
Extensible = true;
value(0; Company)
{
}
value(1; Private)
{
}
}

Las interfaces pueden quedarse obsoletas, como otros tipos de objetos AL, usando las propiedades ObsoleteState, ObsoleteReason y ObsoleteTag, así como el atributo Obsolete. Este enfoque puede ayudar con el proceso de gestión de cambios de interfaz.

Manejar valores de extensión de enumeración eliminados

Sección titulada «Manejar valores de extensión de enumeración eliminados»

Puede usar enumeraciones para seleccionar una implementación de interfaz. Sin embargo, debido a la naturaleza conectable, una extensión de enumeración y su implementación de interfaz correspondiente podrían haberse desinstalado del inquilino, manteniéndose la configuración de la enumeración, lo que ahora apuntará a un valor desconocido. En lugar de que tener un código de la aplicación que agregue la lógica de validación para manejar este escenario, la plataforma debería detectar cuándo se proporciona un valor de enumeración no válido y permitir una forma extensible de manejar ese problema. Este escenario está relacionado con la reserva para el valor predeterminado que se usa cuando no se proporciona ningún valor de enumeración, aunque no es lo mismo.

La propiedad UnknownValueImplementation especifica los implementadores que se usan para los valores ordinales que no están incluidos en la lista definida de valores de enumeración.

UnknownValueImplementation = Interface = InterfaceImplementation;
pageextension 50130 CustListExt extends "Customer List"
{
trigger OnOpenPage()
var
ifoo: Interface IFoo;
e: enum SomeEnum;
begin
e := SomeEnum::Yes;
ifoo := e;
ifoo.Foo(); // => YesFooImpl specified in Implementation on Yes value
e := SomeEnum::No;
ifoo := e;
ifoo.Foo(); // => DefaultFooImpl specified in DefaultImplementation
e := 2; // No enum value matches this.
ifoo := e;
ifoo.Foo(); // => UnknownFooImpl specified in UnknownImplementation
end;
}
interface IFoo
{
procedure Foo();
}
codeunit 50145 ErrorFooImpl implements IFoo
{
procedure Foo()
begin
Message('Bad FOO')
end;
}
codeunit 50146 DefaultFooImpl implements IFoo
{
procedure Foo()
begin
Message('Default FOO')
end;
}
codeunit 50147 YesFooImpl implements IFoo
{
procedure Foo()
begin
Message('Yes FOO')
end;
}
enum 50135 SomeEnum implements IFoo
{
Extensible = true;
UnknownValueImplementation = IFoo = ErrorFooImpl;
DefaultImplementation = IFoo = DefaultFooImpl;
value(0; Yes)
{
Implementation = IFoo = YesFooImpl;
}
value(1; No)
{
// Nothing specified. Using defaults
}
}

La propiedad UnknownValueImplementation se aplica a las enumeraciones. Al desinstalar las extensiones de enumeración, los valores persistentes se pueden volver desconocidos. UnknownValueImplementation proporciona un control de errores genérico en tales casos. Las enumeraciones a menudo se pueden usar para seleccionar una implementación de interfaz. Sin embargo, debido a la naturaleza de un modelo de desarrollo extensible, es posible que se desinstalen una extensión de enumeración y su implementación de interfaz correspondiente de un inquilino, mientras que el valor de la enumeración específica sigue disponible, aunque ahora apuntará a un valor desconocido. El uso de la propiedad UnknownValueImplementation al definir una enumeración evita la aparición de un mensaje de error técnico en la UI y permite un manejo de errores más fácil de usar.

Relacionada con UnknownValueImplementation está la propiedad DefaultImplementation, que se usa para revertir a un valor predeterminado cuando no se proporciona ningún valor de enumeración.