如何扩展这个课程?

时间:2011-11-03 09:45:17

标签: php oop

拥有2种展示方法dispayAsXMLdisplayAsHtml的班级证书。 我想创建2个新类BonusCertificateGuaranteeCertificate,这两个类都有其他属性。

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

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

3 个答案:

答案 0 :(得分:2)

如果您不希望类本身的实例存在,则可以创建类摘要。所以你可以创建一个这样的证书类:

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

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

必须保护变量,否则类的后代无法访问它们。如果没有必要,请保持私密。 abstract public function必须由从此基类扩展的类重写:

class BonusCertificate extends Certificate
{
    protected $bonus;

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

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

所以你最终会得到三个类,第三个是GuaranteeCertificate,看起来像BonusCertificate。

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

还尝试阅读documentation

答案 1 :(得分:0)

您要问自己是否会有证书类的实例。如果允许,则不要使用摘要。如果被阻止,则使用摘要。

还要将类重命名为ICertificate而不是Certificate,以显示它是一个接口

答案 2 :(得分: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中定义的公共函数必须通过从这个基类扩展的类来实现:

class BonusCertificate extends BaseCertificate
{
    protected $bonus;

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

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

所以你最终会得到三个类,第三个是GuaranteeCertificate,看起来像BonusCertificate。

如果您还需要存在“常规”证书实例,只需从基类中删除abstract并实现函数定义,然后适当地移动displayAsXMLdisplayAsHtml函数体进入证书渲染类,因为显示不属于对象类型本身的数据域。

然后将类型属性添加到证书基类,以便您可以区分不同类型的证书。

还尝试阅读documentation