базовый класс:
abstract class Base
{
abstract public function getLenth();
abstract public function getName();
}
два класса из него:
final class ObjA extends Base
{
public function getLenth()
{
return 1;
}
public function getName()
{
return 'Object A';
}
}
.
final class ObjB extends Base
{
public function getLenth()
{
return 6;
}
public function getName()
{
return 'Object B';
}
}
это одно из решений. Это может быть переписано как:
class Base
{
public function getLenth()
{
return static::LENGTH;
}
public function getName()
{
return static::NAME;
}
}
.
final class ObjA extends Base
{
const LENGTH = 1;
const NAME = 'Object A';
}
.
final class ObjB extends Base
{
const LENGTH = 6;
const NAME = 'Object B';
}
какая версия лучше, почему?
РЕДАКТИРОВАТЬ:
Я голосую за 2-е: короче. Но интересно то, как это можно сделать с Java, где нет поздней статической привязки для констант
class Base
{
private String _name;
private int _length;
Base(int length, int name)
{
_length = length;
_name = name;
}
public function getLenth()
{
return _length;
}
public function getName()
{
return _name;
}
}
class ObjA extends Base
{
public ObjA()
{
Base(1, 'Object A');
}
}
Я считаю, что это лучшее решение
Изменить: позвольте мне объяснить, почему на более простом примере:
class Vehicle
{
private int _wheels;
Vehicle(int wheels)
{
_wheels = wheels;
}
}
class Corvette extends Vehicle
{
Corvette()
{
Vehicle(4);
}
}
У Корвета всегда есть четыре колеса, но было бы неправильно сделать из него константу. Это свойство, которое разделяется между такими объектами (= транспортные средства).
Других решений пока нет …