在线飞行覆盖方法组

时间:2016-05-12 20:28:39

标签: c# inheritance

我有一个实现接口的基类:

internal interface ITest
{
    virtual void GetData();
}

internal class Test : ITest
{
    public void GetData()
    {
        Console.WriteLine("Test - Hello World!");
    }
}

通过继承测试类并覆盖 GetData()方法来使用它:

internal class SubTest : Test
{
    public override void GetData()
    {
        Console.WriteLine("SubTest - Hello World!");
    }
}

我有数百个存储过程,每个都需要调用一次。为继承自测试的每个存储过程创建一个新的类,如 SubTest ,似乎有点过分。

有没有办法写一个Lambda Expression,Anonymous Method或Action,让我覆盖空的默认方法?

我正在思考的是这些方面:

var t = new Test();
t.GetData = delegate()
{
    Console.WriteLine("Anonymous - Hello World!");
};

有没有办法像这样编写方法 on-the-fly 的覆盖?

解决!

我使用了Evk的技术来应用Gusman所展示的内容:

internal interface ITest
{
    virtual void GetData();
}

internal class Test : ITest
{
    public void GetData()
    {
        Console.WriteLine("Call from Test");
    }
}

internal class SubTest : Test
{
    private readonly Action _localTest;
    public SubTest(Action localTest)
    {
        _localTest = localTest;
    }
    public override void GetData()
    {
        base.GetData();
        _localTest();
    }
}

以下是我实施它的方式:

class ClassTester
{
    public void Run()
    {
        var t = new Test(() =>
            {
                Console.WriteLine("Anonymous Override of Test");
            }
        );
        t.GetData();
    }
}

3 个答案:

答案 0 :(得分:3)

如果我理解你就可以做到

class DynamicTest : Test {
    private readonly Action _getData;
    public DynamicTest(Action getData) {
        _getData = getData;
    }
    public override void GetData() {
        _getData();
    }
}

然后

var test = new DynamicTest(() => {
      Console.WriteLine("Dynamic");
});

答案 1 :(得分:1)

好吧,如果你只想分配一些外部函数,那么重新定义你的界面,而不是一个函数使用一个Action:

internal interface ITest
{
    Action GetData{ get; set; }
}

internal class Test : ITest
{
    public Action GetData  { get; set; }
}

然后你可以做你想做的事:

var t = new Test();
t.GetData = () =>
{
    Console.WriteLine("Anonymous - Hello World!");
};

您可以将其称为

t.GetData();

答案 2 :(得分:1)

将要执行的存储过程的名称传递给方法Test

朴素是国王。

internal interface ITest
{
    virtual void GetData(string spname);
}

internal class Test : ITest
{
    public void GetData(string spname)
    {
        Console.WriteLine("Executing store proc: " + spname);
    }
}