gpt4 book ai didi

delphi - Delphi 中具有继承性的流畅界面

转载 作者:行者123 更新时间:2023-12-03 15:12:11 25 4
gpt4 key购买 nike

我有以下流畅的接口(interface)声明和实现该接口(interface)的类:

type
IDocWriter = interface
['{8CB5799A-14B1-4287-92FD-41561B237560}']
function Open: IDocWriter;
function Close: IDocWriter;
function Add(const s: string): IDocWriter;
function SaveToStream(Stream: TStream): IDocWriter;
end;

TDocWriter = class(TInterfacedObject, IDocWriter)
public
function Open: IDocWriter;
function Close: IDocWriter;
function Add(const s: string): IDocWriter;
function SaveToStream(Stream: TStream): IDocWriter;
end;

{ TDocWriter }

function TDocWriter.Open: IDocWriter;
begin
Result := Self;
// DoOpen
end;

function TDocWriter.Close: IDocWriter;
begin
Result := Self;
// DoClose
end;

function TDocWriter.Add(const s: string): IDocWriter;
begin
Result := Self;
// DoAdd
end;

function TDocWriter.SaveToStream(Stream: TStream): IDocWriter;
begin
Result := Self;
// DoSaveToStream
end;

我可以像这样使用上面的代码:

var
Stream: TStream;
...
TDocWriter.Create
.Open
.Add('abc')
.Close
.SaveToStream(Stream);

我必须通过添加 SaveToString 函数来扩展上面的接口(interface)。

我不想将该方法添加到原始 IDocWriter 接口(interface)中,因为它不是对所有接口(interface)实现都有效的方法。所以我做了以下工作

type
IStrDocWriter = interface(IDocWriter)
['{177A0D1A-156A-4606-B594-E6D20818CE51}']
function SaveToString: string;
end;

TStrDocWriter = class(TDocWriter, IStrDocWriter)
public
function SaveToString: string;
end;

{ TStrDocWriter }

function TStrDocWriter.SaveToString: string;
begin
Result := 'DoSaveToString';
end;

为了使用ISrDocWriter接口(interface),我必须编写代码

var
Writer: IDocWriter;
s: string;

Writer := TStrDocWriter.Create
.Open
.Add('abc')
.Close;
s := (Writer as IStrDocWriter).SaveToString;

但我希望能够使用它而无需声明 Writer 变量,例如以下代码(当然,无法编译)

  s := TStrDocWriter.Create
.Open
.Add('abc')
.Close
.SaveToString; // Undeclared identifier SaveToString

有什么办法可以实现吗?

对上述接口(interface)和类的任何类型的更改都是可以接受的(显然,除了将这两个接口(interface)合并为一个之外)。

最佳答案

你可以这样写:

s := (TStrDocWriter.Create
.Open
.Add('abc')
.Close as IStrDocWriter)
.SaveToString;

不,不是很好。流畅的接口(interface)和继承这两个习惯用法根本不能混合。

关于delphi - Delphi 中具有继承性的流畅界面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28125514/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com