簡體   English   中英

C#在不同的程序集中定義覆蓋方法

[英]C# Define override method in different assembly

我有一個我構建的類庫,它包含許多從單個基類繼承的類。

在基類上定義了一個名為Process的虛方法,它基本上將類結構的內容處理到應用程序中。

應用程序的不同組件(服務器)之間存在消息傳遞,它們傳遞和接收基類類型的消息,然后調用Process()

我遇到的問題是,我需要能夠覆蓋應用程序其他部分的Process()方法,即在不同的程序集中,而不從中導出另一種類型。

從我所看到的這似乎是不可能的,所以看看是否使用接口將解決問題?

編輯:

我在問題中沒有提到的是基類的每個派生類需要具有不同的Process()實現,具體取決於該類所需的功能。

例如:

class First : BaseClass
{
  override void Process()
  {
    //do something
  }
}

class Second : BaseClass
{
  override void Process()
  {
    //do something else
  }
}

覆蓋過程方法中的代碼需要位於不同的程序集中,因為此代碼將基於其所屬的類引用其他外部源,而不希望在整個應用程序中傳播。

只是為了澄清我有訪問權限,如果需要可以更改庫類。

我一直在做進一步的閱讀,看起來使用代表可以解決這個問題..想法?

接口,特別是策略模式將解決您的問題。

public interface IProcessStrategy
{
    void Process();
}

public class ProcessService
{
    public void DoProcess( IProcessStrategy strategy )
    {
        ...whatever
        strategy.Process();
        ...whatever else
    }
}

通過將處理分離為自己的抽象,您可以創建多個策略,從技術上講,如果策略是在相同或不同的程序集中定義的,則無關緊要。

更新:我想我終於知道你在做什么,我的建議是有一個你可以注入的接口,但仍然有一個默認的實現。

public interface IProcessStrategy
{
    void Process();
}

public class BaseClass
{
    private IProcessStrategy _strategy;

    public void Process()
    {
        // this is where the real "override" happens
        if ( _strategy == null )
        {
            // default implementation
            ...
        }
        else
            // overridden
            _strategy.Process();
    }

    public void OverrideWith( IProcessStrategy strategy )
    {
        this._strategy = strategy;
    }

你使用它的方式:

 BaseClass f = new BaseClass();
 f.Process(); // uses the default implementation

和其他地方

 BaseClass f = new BaseClass();
 IProcessStrategy p = new First();

 // override
 f.OverrideWith( p );
 f.Process(); // overridden with a new implementation

注意那個被重寫的實現, First可以在任何地方定義,包括不同的程序集,它只需要實現通用接口。

暫無
暫無

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

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