Per prima cosa vorrei menzionare che non sono abbastanza sicuro di quale sia il termine che descrive il problema, ma spero di poterlo illustrare con un po 'di codice.
Problema: una libreria di classi condivisa definisce un'interfaccia e ogni applicazione che fa riferimento a questa libreria fornisce la propria implementazione di tale interfaccia. Ora all'interno della libreria condivisa, voglio chiamare l'effettiva implementazione di quel metodo.
Cercando di risolvere questo problema ho immaginato un semplice scenario in cui 2 applicazioni specifiche della piattaforma Windows , Android condividono del codice tranne alcune funzioni specifiche della piattaforma che devono essere implementate separatamente per ciascun sistema. In fase di runtime, devo chiamare in modo trasparente tale implementazione sapendo che è già fornita dall'implementatore.
Vengono create tre applicazioni console condivise , Windows , Android
Progetto condiviso definisce un'interfaccia IShared
namespace Project
{
public interface IShared
{
void Speak(string word);
}
}
Implementi Android IShared
namespace Project.Android
{
public class SpeakAndroid: IShared
{
public void Speak(string word)
{
Console.WriteLine("Android Speaks");
}
}
}
Implementi di Windows IShared
namespace Project.Windows
{
public class SpeakWindows: IShared
{
public void Speak(string word)
{
Console.WriteLine("Speak Windows");
}
}
}
Ora che il progetto condiviso è in grado di chiamare ogni funzione specifica Speak
di ogni piattaforma, ho deciso di dichiarare un
public static IShared SharedDefinition { get; set; }
a cui assegno una nuova implementazione all'interno di progetti Windows e Android come
Windows:
Project.Program.SharedDefinition = new SpeakWindows();
Anrdoid:
Project.Program.SharedDefinition = new SpeakAndroid();
In questo modo nel progetto condiviso posso chiamare Program.SharedDefinition.Speak();
e, a seconda della piattaforma corrente, otterrò diverse implementazioni di Speak
.
Question (s):
- Questo è un modo corretto di risolvere il problema precedente? servizio Locator Pattern ha qualcosa a che fare con questo?
- Per ulteriori letture, il problema sopra riportato ha un nome o un modello che meglio si adatta a questo?