簡體   English   中英

我如何在 inheritance 鏈中多次實現該接口的同時顯式實現該接口?

[英]How can i explicitly implement an interface while having implemented that interface multiple times in inheritance chain?

在我的 Unity C# 項目中,我有這些接口:

interface IGameService
{
 void Initialize(params object[] args);
}

interface IADManager : IGameService
{
 void Show();
}

interface IIAPManager : IGameService
{
 void Purchase();
}

還有一個 class:

public class MonatizationManager : IAPManager, IADManager
{
 ... 
}

我有一個 IGameService 類列表,我需要對其進行初始化(我也在使用 Zenject)。 例如:

// this basicly means that _iapSettingsProvider and _adSettingsProvider will contain link to a class that implements IADManager and IIAPManager interfaces. In my case this is the same class for these two  interfaces - MonatizationManager 
[Inject] private readonly ISomeSettingsProvider1 _someSettingsProvider1; // example
...
[Inject] private readonly IADManager _iapSettingsProvider;
[Inject] private readonly IIAPManager _adSettingsProvider;
...
[Inject] private readonly ISomeSettingsProvider2 _someSettingsProvider2; // example

// here i initialize my classes (some are managers, some are just providing game settings etc)
// all initQueue's elements must implement IGameService interface
var initQueue = new GameTaskQueue();
initQueue.Add(new GameTaskInitService(_someSettingsProvider1)); // example
...
initQueue.Add(new GameTaskInitService(_iapSettingsProvider));
initQueue.Add(new GameTaskInitService(_adSettingsProvider));
...
initQueue.Add(new GameTaskInitService(_someSettingsProvider2)); // example

// here my queue is starting to initialize my IGameService classes (basically just calling Initialize() method for each element in the queue)
initQueue.Start();

問題來了:我對 IADManager 和 IIAPManager 有相同的 class (MonatizationManager),同時我還需要分別初始化這些接口。 那么,MonatizationManager class 會是什么樣子呢?

首先,我試過:

// it did not work
public class MonatizationManager : IAPManager, IADManager
{
 IGameService.IADManager.Initialize(params object[] args) {...}
 IGameService.IIAPManager.Initialize(params object[] args) {...}
}

然后我嘗試了(也沒有用):

interface IADManager : IGameService
{
 new void Initialize(params object[] args);
 void Show();
}

interface IIAPManager : IGameService
{
 new void Initialize(params object[] args);
 void Purchase();
}

public class MonatizationManager : IAPManager, IADManager
{
 void IIAPManager.Initialize(params object[] args)
 {
  ...
 }

 void IADManager.Initialize(params object[] args)
 {
  ...
 }
// compiler wants me to also write this method, but i think i don't need it
 public void Initialize(params object[] args)
 {
  ...
 }
}

是否有可能在我的 MonatizationManager class 中為這兩個接口(IIAPManager 和 IADManager)顯式實現 Initialize(params object[] args) 方法?

您的設計有點過於復雜。 您應該只實現一個Intialize方法,而不是兩個。 客戶端使用您的 class 並且必須調用Initialize兩次,這將非常令人困惑。 然而,單個實現當然可以做任何你想做的事,例如調用兩個私有方法

此外,您的經理類已經一個IADManager ,因此沒有理由還擁有該類型的成員並通過調用其成員來使用該成員(除非您實現裝飾器模式或類似模式)。

所以我建議改用這個:

interface IGameService
{
    void Initialize(params object[] args);
}    
interface IADManager : IGameService
{
    void Show();
}    
interface IIAPManager : IGameService
{
    void Purchase();
}

public class MonatizationManager : IAPManager, IADManager
{
    void Initialize(params object[] args) 
    {
        // code for initializing the one interface
        // code for initializing the other interface
    }
    void Show() { ... }
    void Purchase() { ... }
}

順便說一句,您通常會初始化特定的,而不是接口 雖然每個 class 都有一些初始化方法並不一定意味着這種初始化應該在公共接口上可用。 具有這樣的設計將啟用對Initialize的多次調用,例如,這通常不是預期的。 相反,您應該在構造函數代碼中提供一個完全可用的 class(除非發生了一些重大的魔法,在這種情況下您將實現一些延遲加載)。 然后你的客戶端代碼不需要知道它是否已經初始化了 class,因為它已經得到了一個完全初始化的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM