如何理解面向对象中的“依赖倒置原则”?最好举个例子 ( 积分: 100 )

  • 主题发起人 主题发起人 刘一飞
  • 开始时间 开始时间

刘一飞

Unregistered / Unconfirmed
GUEST, unregistred user!
依赖倒置原则:依赖于抽象,而不要依赖于具体。
在《道发自然》中这样解释到:依赖倒置原则强调的是一种反向的依赖关系,通过依赖倒置原则,可以很容易的满足开闭原则,。这是因为,在反向的依赖关系中,客户程序不会直接调用派生类的任何方法,而只是调用基类的的方法,基类通过调用自己的虚函数来把控制权传递给应用程序实现的具体的派生类,即基类依赖特定的派生类。
////////////////////////////////////////////////////////////////////////////
对上面的这句话,我理解上有些矛盾,请各位同仁帮助解释一下,最好用个示例,在此表示感谢!
 
依赖倒置原则:依赖于抽象,而不要依赖于具体。
在《道发自然》中这样解释到:依赖倒置原则强调的是一种反向的依赖关系,通过依赖倒置原则,可以很容易的满足开闭原则,。这是因为,在反向的依赖关系中,客户程序不会直接调用派生类的任何方法,而只是调用基类的的方法,基类通过调用自己的虚函数来把控制权传递给应用程序实现的具体的派生类,即基类依赖特定的派生类。
////////////////////////////////////////////////////////////////////////////
对上面的这句话,我理解上有些矛盾,请各位同仁帮助解释一下,最好用个示例,在此表示感谢!
 
停~~~~~~~~~~~~~`
 
ROBERT MARTIN这样描述依赖倒置原则
(1)上层模块不应该依赖于下层模块,他们共同依赖于一个抽象。
(2)抽象不能以来具象(体),具象(体)依赖于抽象。
其含义是:
为了消除两个模块之间的依赖关系,应该在两个模块之间定义一个
抽象接口,上层模块调用抽象接口定义的函数,下层模块实现该接口。
下面用DELPHI举个例子“
TPa=class
procedure text;virtual;abstract;
end;
{TPa类为一个抽象类,其方法text只有声明,没有实现,可看作是一个抽象接口}
TCA=CLASS(TPA)
PROCEDURE TEXT;OVRREDE;
END;
PROCEDURE TCA.text;
begin
showmmessage(‘下层模块实现’);
end;
{TCA是TPa类的子类,要实现父类的抽象方法,必须在后面加OVRRIDE,可看做是下层模块},
PROCEDURE TFORM1.BUTTON1CLIK(SENDER:TOBJECT);
VAR
EXAP:TPa;
begin
EXAP:=TCA.CREATE;
EXAP.TEXT;
end;
{TFORM1就可以看作是上层模块}
其实我们在平时经常用到”依赖倒置原“
例如
var
strd:Tstrings;
begin
strd:=Tstringlist.create;
..........
end;
在实际应用中,我们总是用抽象类的子类而不是它本身来构造实例
在C和C++中,抽象方法被称为纯虚函数。
 
接受答案了.
 
后退
顶部