В C # есть ли способ переопределить приватную или публичную функцию через плагин? - PullRequest
2 голосов
/ 07 декабря 2010

У меня есть приложение, которое загружает плагины.У меня есть плагин, который имеет полный доступ к экземпляру формы.Если у меня есть функция в форме, которая должна быть переопределена, но не является виртуальной функцией, есть ли другой способ переопределить ее?

Вот очень общий пример:

//Form I am modifying
public partial class MyForm : Form
{
    public int myVariable1;
    public int myVariable2;

    //Constructor and other methods here

    private void setVar(int replacementValue)
    {
        myVariable1 = replacementValue;
    }
}

... затем в отдельной dll ...

//My plugin
public class MyPlugin : IMyPluginBase
{
    MyForm theForm; //Reference to the form in the main application

    //Constructor and other methods here

    private void setVar(int replacementValue)
    {
        theForm.myVariable2 = replacementValue;
    }
}

В этом примере функция в форме устанавливает 'myVariable1', а функция 'setVar' в плагине устанавливает 'myVariable2'.

Итак, вопрос в этом примере, могу ли я заменить / переопределить функцию setVar формы на функцию в плагине?Может быть, с сообщениями или размышлениями?

Ответы [ 3 ]

2 голосов
/ 07 декабря 2010

Нет.Вы не можете «заменить» или переопределить частные не виртуальные методы в C #.

Язык C # (и среда выполнения .NET) не поддерживают динамическую замену методов описанным вами способом.Насколько мне известно, очень немногие языки поддерживают эту возможность (я полагаю, что SmallTalk и Objective-C оба поддерживают).

Если это единственное место в вашем приложении, где вам нужна такая расширяемость, вы можете достичь еечерез интерфейс, делегат или наследование + виртуальные методы.Любой из этих подходов может сработать ... какой из них вы выберете, зависит от того, какую расширяемость вы желаете.

Если вы ожидаете иметь много таких точек расширяемости в своем приложении, то вам, вероятно, стоит взглянуть на Управляемая расширяемая структура (MEF).Он предоставляет поддерживаемую Microsoft модель для создания подключаемых архитектур с использованием шаблонов и техник, которые хорошо работают в .NET.

1 голос
/ 07 декабря 2010

Если функция не помечена как виртуальная или часть интерфейса , которую реализует ваш класс, есть ровно 0 шансов, что вы сможете переопределить ее. Нет плагинов, нет размышлений, нет ничего, просто забудьте об этом или используйте другой динамический язык, но не C #.

0 голосов
/ 07 декабря 2010

Короткий ответ на ваш вопрос - нет. Однако вы можете предоставить своей форме копию IMyPluginBase и вызвать Form.setVar () для MyPluginBase.SetVar ().

Код будет выглядеть примерно так:

public partial class MyForm : Form
{
    public int myVariable1;
    public int myVariable2;

    public IMyPluginBase MyPlugin;

    //Constructor and other methods here

    private void setVar(int replacementValue)
    {
        MyPlugin.setVar(replacementValue);
        //myVariable1 = replacementValue;
    }
}

public class MyPlugin : IMyPluginBase
{
    MyForm theForm; //Reference to the form in the main application
    public void setVar(int replacementValue)
    {
        theForm.myVariable2 = replacementValue;
    }
}

Обратите внимание, что setVar () необходимо определить в IMyPluginBase.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...