这两组代码有什么区别
时间:2020-03-06 15:01:47 来源:igfitidea点击:
这两段代码有什么区别
type
IInterface1 = interface
procedure Proc1;
end;
IInterface2 = interface
procedure Proc2;
end;
TMyClass = class(TInterfacedObject, IInterface1, IInterface2)
protected
procedure Proc1;
procedure Proc2;
end;
以及以下内容:
type
IInterface1 = interface
procedure Proc1;
end;
IInterface2 = interface(Interface1)
procedure Proc2;
end;
TMyClass = class(TInterfacedObject, IInterface2)
protected
procedure Proc1;
procedure Proc2;
end;
如果它们是相同的,那么两者之间是否存在任何优势或者可读性问题。
我想第二种方法意味着我们必须编写一个实现IInterface2的类而不实现IInterface1,而第一种方法则可以。
解决方案
假设你的意思
... IInterface2 = interface(Interface1) ...
我和我们解释的一样,第二种形式也需要一个实现Interface2的类来实现Interface1,而第一种形式则不需要。
I guess the second means you cannot write a class that implements IInterface2 without implementing IInterface1, whilst with the first you can.
那将是技术上的差异。
哪一个更好取决于很大程度上取决于接口。如果IInterface2既不是IInterface1,也存在吗?
如果IInterface1是"可显示的"而IInterface2是"可存储的",则第一个选项可能更有意义。如果IInterface1是"车辆",而IInterface2是"卡车",则第二个选项可能更有意义。
首先,我假设IInterface2的第二个示例的声明是一个错字,应为
IInterface2 = interface(Interface1)
因为从自身继承是毫无意义的(即使编译器接受了)。
"继承"是在那里回答问题的关键词。在示例1中,两个接口是完全独立的,我们可以实现一个,另一个或者两个都没有问题。在示例2中,我们正确地知道,如果不同时实现interface1也不能实现interface2,但是之所以如此,是因为它使interface1成为interface2的一部分。
因此,区别主要是结构和组织上的差异,而不仅仅是可读性。
如果我们谈论的是用于Win32的Delphi(Delphi for .NET具有不同的规则),则这两个代码段的效果非常不同,并且几乎没有等效。
- 实现其接口的类必须实现该接口的祖先的所有成员,但不会隐式实现祖先。因此,在第二种情况下,尝试将类型为TMyClass的实例分配给类型为IInterface1的位置将失败。
- 与上一点有关,如果IInterface1和IInterface2都具有GUID,则在第二种情况下,目标类型为IInterface1的接口引用的动态转换(使用" Supports"或者" as")将失败。
- 接口IInterface2在第二种情况下有一个额外的方法,而在第一种情况下则没有。
- 在第二种情况下,类型IInterface2的值可分配给类型IInterface1的位置。对于第一种情况,情况并非如此。
在此示例中自己看看:
type
A_I1 = interface
end;
A_I2 = interface(A_I1)
end;
A_Class = class(TInterfacedObject, A_I2)
end;
procedure TestA;
var
a: A_Class;
x: A_I1;
begin
a := A_Class.Create;
x := a; // fails!
end;
type
B_I1 = interface
end;
B_I2 = interface
end;
B_Class = class(TInterfacedObject, B_I1, B_I2)
end;
procedure TestB;
var
a: B_Class;
x: B_I1;
begin
a := B_Class.Create;
x := a; // succeeds!
end;
begin
TestA;
TestB;
end.

