【发布时间】:2016-11-19 16:38:03
【问题描述】:
我有一个实现接口的基类:
internal interface ITest
{
virtual void GetData();
}
internal class Test : ITest
{
public void GetData()
{
Console.WriteLine("Test - Hello World!");
}
}
通过继承Test类并覆盖GetData()方法来使用:
internal class SubTest : Test
{
public override void GetData()
{
Console.WriteLine("SubTest - Hello World!");
}
}
我有数百个存储过程,每个都需要调用 1 次。为每个从 Test 继承的存储过程创建一个像 SubTest 这样的新类似乎有点过头了。
有没有办法编写 Lambda 表达式、匿名方法或动作,让我覆盖空的默认方法?
我的想法是这样的:
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();
}
}
【问题讨论】:
-
鉴于
Test没有实现,它甚至不应该是一个类。只需让派生自它的类实现接口即可。 -
@Servy - 为了这个例子,我在上面放了一些简单的东西。它不是我们完整的公司数据库类。我应该添加详细信息吗?
-
@Servy,我编辑了问题以显示每个方法的调用位置。
-
你可以创建一个类,它的
GetData方法简单地执行一个委托,通过公共属性设置(或在ctor中传递)。 -
@jp2code 我感觉到你的痛苦,但你要做的任何事情都需要改变类和接口。
标签: c# inheritance