2016-05-19 81 views
0

背景:我試圖使用其平臺的具體SDK對火力地堡融入我MVVMCross應用程序。我的設置的基本部分正在工作,即我可以使用基本Firebase功能從我的viewmodel中從Firebase數據庫中檢索信息。它在我的PCL中使用一個接口,在UI項目中具有特定於平臺的實現。有方法,它返回同一個類的實例MVVMCross平臺特定的類

問題:我想,但是,實現我的接口中的方法(和它的實現),可以處理的事實,火力地堡的Java SDK中有一個名爲「火力地堡」有返回的方法類同一類型(「火力地堡」),如在Java SDK中的「兒童」的方法:

Firebase firebase = new Firebase("URI"); 
Firebase firebasechild = firebase.Child("test"); // Of same type! 
firebasechild.DoStuff(); 

我試圖讓我的視圖模型類似的功能:

firebase = Mvx.Resolve<IFirebaseConnection>(); 
firebase.FirebaseConnection ("URI"); 
IFirebaseConnection firebasechild = firebase.Child("test"); 
firebasechild.DoStuff(); 

的相關部分我的PCL中的界面是:

public interface IFirebaseConnection 
{ 
    void FirebaseConnection (string URI); 

    IFirebaseConnection Child(string child); // Probably wrong? 

    void DoStuff(); 
} 

我在我的Android UI項目setup.cs包含:

Mvx.RegisterType<IFirebaseConnection, FirebaseDroid>(); 

在安卓平臺具體實現是:

public class FirebaseDroid : IFirebaseConnection 
{ 
    protected Firebase firebase; 

    public void FirebaseConnection (string URI) 
    { 
     var mvxTopActivity = Mvx.Resolve<IMvxAndroidCurrentTopActivity>(); 
     Firebase.SetAndroidContext (mvxTopActivity.Activity); 
     firebase = new Firebase (URI); 
    } 

    public IFirebaseConnection Child (string child) 
    { 
     return firebase.Child (child); // This is obviously wrong 
    } 

    public void DoStuff(){// do something} 
} 

以上顯然是錯誤的,因爲firebase.Child()是鍵入「Firebase」而不是「IFirebaseConnection」,或者更準確地說是「FirebaseDroid」。有沒有辦法處理與實現特定於平臺的服務時類相同類型的方法?

回答

1

你可以引入一個新的私有構造函數。

public class FirebaseDroid : IFirebaseConnection 
{ 
    protected Firebase firebase; 

    public FirebaseConnection() {} 

    private FirebaseConnection (Firebase firebase) 
    { 
     SetFirebase(firebase); 
    } 

    public void FirebaseConnection (string URI) 
    { 
     SetFirebase(new Firebase (URI)); 
    }  

    private void SetFirebase(Firebase firebase) 
    { 
     var mvxTopActivity = Mvx.Resolve<IMvxAndroidCurrentTopActivity>(); 
     Firebase.SetAndroidContext (mvxTopActivity.Activity); 
     this.firebase = firebase; 
    } 

    public IFirebaseConnection Child (string child) 
    { 
     return new FirebaseConnection(firebase.Child (child)); 
    } 

    public void DoStuff(){// do something} 
} 
相關問題