拥有2种展示方法dispayAsXML
和displayAsHtml
的班级证书。
我想创建2个新类BonusCertificate
和GuaranteeCertificate
,这两个类都有其他属性。
我应该提取一个包含这些属性的Abstract类,并从抽象类3新类扩展,还是可以保留此证书类并从中扩展新类?使用新属性并覆盖新类中的displayAsXML
abd displayAsHtml
方法?
class Certificate {
private $isin;
private $tradingMarket;
private $currency;
private $issuer;
private $issuingPrice;
private $currentPrice;
}
答案 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
,然后在适当的位置创建displayAsXML
和displayAsHtml
函数体。证书课程。您仍然可以在派生类中覆盖这些函数。
还尝试阅读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
并实现函数定义,然后适当地移动displayAsXML
和displayAsHtml
函数体进入证书渲染类,因为显示不属于对象类型本身的数据域。
然后将类型属性添加到证书基类,以便您可以区分不同类型的证书。
还尝试阅读documentation。