2011-11-03 59 views
1

拥有2种展示方式的证书dispayAsXMLdisplayAsHtml。 我想创建2个新类和GuaranteeCertificate这两个都有其他属性。如何扩展这个类?

我应该提取一个包含这些属性并从抽象类3新类继承的抽象类,或者我可以保留这个证书类,并从中扩展新的类?使用新属性并覆盖新类中的displayAsXML abd displayAsHtml方法?

class Certificate { 
     private $isin; 
     private $tradingMarket; 
     private $currency; 
     private $issuer; 
     private $issuingPrice; 
     private $currentPrice; 
} 
+0

也许神奇的方法__set和__get是值得关注的,你可以通过使用__set和__get方法来操作变量范围 –

+0

也许你能解释一下你需要达到什么目的? – Marcx

+0

是否有关自动刷新数据的问题?如果这是个问题,我会尝试使用AJAX每隔X秒更新一次(new $ object)对象。 (谷歌提供了关于AJAX的大量英特尔信息)如果你想创造一个价格历史并且想要存储它:使用一个数据库,或者创建一个以时间为关键的巨大数组。您希望用户如何发布此文档?你的服务器在哪里得到它?你也可能想添加一些额外的类和方法。 (例如一个文档类,告诉关于你的文档的所有内容)如果是关于计算所有这些?经济?东西 - >我不能 – NikM

回答

2

如果您不希望类自身的实例存在,那么可以创建一个类抽象。所以,你可以创建一个证书类是这样的:

abstract class Certificate 
{ 
    protected $isin; 
    protected $tradingMarket; 
    protected $currency; 
    protected $issuer; 
    protected $issuingPrice; 
    protected $currentPrice; 

    abstract public function displayAsXML(); 
    abstract public function displayAsHtml(); 
} 

的变量必须得到保护,否则类的decendants无法访问它们。如果没有必要,请保持私密。该abstract public function■找到由从这个基类扩展类中重写:

class BonusCertificate extends Certificate 
{ 
    protected $bonus; 

    public function displayAsXML() 
    { 
     // Do your thing 
    } 

    public function displayAsHtml() 
    { 
     // Do your thing 
    } 
} 

所以你最终有三个班,第三个是GuaranteeCertificate和看起来像BonusCertificate。

如果您还需要“常规”证书实例存在,只需从类和函数定义中删除abstract,然后在Certificate类中适当地创建displayAsXMLdisplayAsHtml函数体。您仍然可以在派生类中重写这些函数。

另请尝试阅读关于此的documentation

+0

你的第一个代码片段包含错误:非抽象类可能不包含PHP中的抽象方法。 –

+1

我已经修好了,但谢谢。 :-) – CodeCaster

0

你问自己是否会出现证书类的实例。如果这是允许的,那么不要使用抽象。如果阻止,则使用抽象。

而且重命名类ICertificate代替证明书以证明它是一个接口

+1

抽象类是* not *接口,它们是两种不同的工具。抽象类可以有实现,而接口不能。由于这种区分,不需要更改/添加类名前缀,尽管提高'instanceof'运算符的可读性可能是一个很好的惯例。然而,这样的命名约定对PHP的功能没有任何影响。另见:[PHP中的接口](http://php.net/manual/en/language.oop5.interfaces.php)和[PHP中的抽象](http://php.net/manual/en/language。 oob5.abstract.php) –

+1

Bob叔叔说:*如果你用我的接口作为前缀,问问你自己为什么要你的客户知道它是一个接口。为什么这对他们很重要?* [source](https://twitter.com/#!/unclebobmartin/status/131376415328309249) – Gordon

+0

@PelletenCate,我明白你的意思了。谢谢你的提示 –

0

你让一个抽象类,如果它是不完整的,你永远不希望自己的类的实例存在。

但首先你定义证书的接口:

interface Certificate 
{ 
    public function displayAsXML(); 
    public function displayAsHtml(); 
} 

所以,你可以创建一个证书基类是这样的:

abstract class BaseCertificate implements Certificate 
{ 
    protected $isin; 
    protected $tradingMarket; 
    protected $currency; 
    protected $issuer; 
    protected $issuingPrice; 
    protected $currentPrice; 
} 

的变量必须得到保护,否则阶级的后代不能访问他们(而抽象的阶级不会使用他们)。如果没有必要,请保持私密(如果完全不使用,则将其删除)。在interfacce定义的公共function`s必须由从这个基类扩展类来实现:

class BonusCertificate extends BaseCertificate 
{ 
    protected $bonus; 

    public function displayAsXML() 
    { 
     // Do your thing 
    } 

    public function displayAsHtml() 
    { 
     // Do your thing 
    } 
} 

所以你最终有三个班,第三个是GuaranteeCertificate和看起来像BonusCertificate。

不过,若你还需要“常规”证书情况存在,只需删除从基类的abstract并实现功能的定义,然后将displayAsXMLdisplayAsHtml函数体适当纳入证书渲染类,因为显示器不属于到对象类型本身的数据域。

然后将一个类型属性添加到证书基类,以便您可以在不同类型的证书之间有所不同。

另请尝试阅读关于此的documentation