簡體   English   中英

使用動態方法處理特定派生類時的方法解析和未定義方法的處理

[英]Method resolution when using dynamic and handling of undefined method for specific derived class

讓我們假設以下繼承圖:

A <-B <-C <-D <-E <-...(繼承樹實際上比此示例復雜,並且包含數百個實際類型)。 我不擁有這些類型,也無法控制其實現

我們還假設一組靜態方法:

句柄(A a),句柄(B b),句柄(C c),句柄(D d)等。

我當前的Handle(A a)實現通過使用dynamic關鍵字“調度”到所需的方法:

public static void Handle(A a)
{
    Handle((dynamic)a);
}

public static void Handle(B b)
{
    //B specific processing
}

//And so on

主機應用程序通過A[]向我發送對象,盡管每個對象可以具有不同的運行時類型。 就目前而言,我什至對A類型A對象都不感興趣。

我需要不同的Handle方法,因為客戶要執行的處理根據對象的運行時類型而不同。

只要我的代碼中有一個Handle方法,並為傳入的對象的運行時類型提供相應的簽名,我的實現就可以很好地工作,但是就目前而言,當傳入的對象沒有作為特定的Handle方法, Handle(A a)方法被遞歸調用,從而導致堆棧溢出。

很顯然,我無法為可能從主機應用程序傳遞的大約一百種類型定義Handle(X x)方法,並且該主機應用程序API的每個后續版本都可以定義新類型。

因此,我的問題是如何處理沒有特定Handle方法的類型,而不必執行無休止的一系列if語句甚至長的switch語句來篩選我沒有處理程序方法的對象?

在運行時,是否有任何方法可以確定傳入的對象的運行時類型是否確實存在Handle方法? 還是有其他方法可以徹底處理“缺失”方法?

歡迎任何見解/建議。

我不記得我在Handle(A a)得到這種調度的想法Handle(A a) 我記得在某些網站上看到過類似的東西,但是我現在意識到,它一定已應用於與我要實現的目的不同的用例。

我通過簡單地將強制轉換(dynamic)obj移到“處理”方法之外並返回到調用方來解決了我的問題:

 Logger.Handle((dynamic)obj);

在我的實現中,用於層次結構基礎的一個現在只是一個空方法:

 public class Logger
 {
      public static void Handle(A a){}

      public static void Handle(B b)
      {
           //B specific handling
      }

      //All other Handle methods
 }

這樣就解決了問題。 如果派生類型不存在特定方法,則調用Handle(A a)方法,不執行任何操作。

暫無
暫無

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

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