在以下代码中,MYClassB
继承自MYClassA
和IMyinterface
。但是MYClassA
已经IMyinterface
侵犯了MYClassB : MYClassA
。
在没有IMyinterface
的情况下使用interface IMyinterface
{
void myfunc();
}
abstract class MyClassA : IMyinterface
{
public virtual void myfunc()
{
Console.WriteLine("myfunc in MYClassA");
}
}
class MYClassB : MyClassA, IMyinterface
{
public override void myfunc()
{
Console.WriteLine("myfunc in MYClassB");
}
}
是否有任何差异?
如果1.有一些差异请向我解释。有没有理由在现实世界中使用这种混乱的类?
import org.apache.jmeter.config.Argument;
import org.apache.jmeter.config.Arguments;
Arguments argz = ctx.getCurrentSampler().getArguments();
for (int i = 0; i < argz.getArgumentCount(); i++) {
Argument arg = argz.getArgument(i);
if (arg.getName().equals("email")) {
vars.put("EMAIL", arg.getValue());
break;
}
}
答案 0 :(得分:3)
重新声明类型实现实现接口并不会在您显示的特定示例中更改中的任何内容,但 可能会影响其他内容的情况。
具体来说,重新声明类型实现接口会重新绑定实现接口的方法。现在,在您的示例中,这是不可靠的,因为,因为myfunc
是虚拟的并且被覆盖,所以即使MYClassB
中的方法未被重新约束,也会执行相同的方法体实现接口的方法。但请考虑这个例子:
interface IMyinterface
{
void myfunc();
}
abstract class MyClassA : IMyinterface
{
public void myfunc()
{
Console.WriteLine("myfunc in MYClassA");
}
}
class MYClassB : MyClassA, IMyinterface
{
public new void myfunc()
{
Console.WriteLine("myfunc in MYClassB");
}
}
有这样的用法:
IMyinterface instance = new MYClassB();
instance.myfunc();
这里,输出为MYClassB
,因为myfunc
被重新绑定为接口的实现,成为MyClassB
中的实现。但是,如果您将MYClassB
的声明更改为:class MYClassB : MyClassA
,则代码的输出突然变为MYClassA
实现,因为接口的实现永远不会从指向{的重新绑定{1}}的实施。
此外,如果派生类想要提供显式接口实现,则需要显式重新声明它正在实现接口。
答案 1 :(得分:0)
功能上没有区别。通过继承MyClassA,您的MyClassB对象隐式符合您的IMyInterface。以你的方式定义它是明确的,并且会立即显示任何浏览你的代码的人,它实现了接口,但就是这样。通过在MyClassB定义上声明接口实现,您无法获得其他任何东西。
一个真实世界的例子可能是你有一个必须实现的契约(IMyInterface),但是很多实现你做了非常类似的操作来执行小偏差的工作。在这种情况下,您将从MyClassA中定义的template pattern实现。