作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如果我在基类上实现接口,它将被其子类继承,我知道函数/过程将是,但是我对是否能够将子类转换为接口然后返回到它更感兴趣。原班。
我希望我能做的是将不同基类的对象传递给一个函数,然后在函数中确定类型并在适当时使用它们。
这可能吗,这是正确的方法吗?
更新资料
为了消除任何混乱(或创建更多混乱),这就是我想做的事情(深入到其核心)。
接口
IMyInterFace = interface
['{B7203E50-F5CB-4755-9DB1-FB41B7B192C5}']
function MyFunction: Boolean;
end;
type TMyObject = class(TInterfacedObject,IMyInterFace)
type TSubMyObject = class(TMyObject)
type TMyOtherObject = class(TInterfacedObject,IMyInterFace)
procedure foo();
var obj:TSubMyObject;
begin
obj := TSubMyObject.Create();
SendInterfaceObject(obj);
end;
procedure bar();
var obj:TMyOtherObject;
begin
obj := TMyOtherObject.Create();
SendInterfaceObject(obj);
end;
procedure SendInterfaceObject(iobj:IMyInterFace);
begin
if (iobj is TSubMyObject) then
begin
//code here
end
else if (iobj is TMyOtherObject) then
begin
//code here
end;
end;
最佳答案
是的,该接口是由子类继承的。
从子类强制转换为接口是完全可以接受的。
但是,如果我读错了您的问题,并且如果“然后再返回其原始类”的意思,则表示歉意。 。 。
您具有接口I,A类和B类。
A可以实现I,而B可以继承A,但实际上不应该从A强制转换为B。
编辑:
您想从B到I再回到B。 。 。但是您已经有了对B的引用,如果B是要传递给函数的内容,那么您不需要从I强制转换为B(除非正在谈论其他对象,否则请不要这样做)
从I到B与从A到B相同,您正在尝试构建继承链,这实际上是您不应该做的。需要这样做是一种代码味道,它告诉您应该尝试以其他方式解决此问题(可能是通过重新设计类(例如,向I添加更多属性/方法),或者只是确定该功能仅能工作)子类-使用子类“ B”将使您可以访问A和I的所有方法)。
您可以编辑问题并添加一些示例代码来说明您要做什么吗?
编辑2
procedure SendInterfaceObject(iobj:IMyInterFace);
begin
if (iobj is TSubMyObject) then
begin
//code here
end;
end;
if(item.Color = Red) then
item.ContrastColor := Blue;
else
item.ContrastColor := Red;
关于delphi - Delphi接口(interface)是否在子类中继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/515307/
我是一名优秀的程序员,十分优秀!