- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我读到的关于类结构的示例通常从一个基类开始,然后该基类通过更细化的类进行扩展,即。经常被引用的:
class Animal {}
class Rodent extends Animal {}
class Mouse extends Rodent {}
但在我的 CMS/电子商务系统的现实世界项目中,我似乎正在以相反的方式构建这种结构,即从一种情况的类开始,然后用与整个项目相关但实际上与整个项目相关的东西扩展它扩展类。
class page {}
class product extends page{}
class category extends product{}
class basket extends category{}
class shop extends basket{}
因此,通过这种方式,我只需调用 $s = new shop() 并访问运行该商店所需的所有类/方法。我想我只是扩展类以保存分别实例化每个类。这似乎与我读过的大多数示例背道而驰,而且我肯定错过了 OOP 在这里的全部内容。随着类(class)的扩展,我的类(class)似乎变得越来越普遍,越来越不专业。
我应该继续这种方式还是重新构建我构建这个类系统的方式?
最佳答案
您可以在谷歌上搜索组合优于继承和is-a vs has-a。
在您的设计草图中,您混合了一堆您注意到的东西。最容易剖析的示例是 class category{} extends product
。一个类别不是产品,但它有/包含多种产品。这会更合适:
class product {
public $title; // for simplicity
public $price; // for simplicity
}
class category {
private $name;
private $products;
public function __construct($name) {
$this->name = $name;
$this->products = array();
}
public function addProduct(product $p) {
$this->products[] = $p;
}
public function printProducts() {
$product_names = array_map(function($product) {
return $product->title;
}, $this->products);
echo implode(', ', $product_names);
}
}
$c = new category('fruits');
$apple = new product;
$apple->title = 'apple';
$orange = new product;
$orange->title = 'orange';
$banana = new product;
$banana->title = 'banana';
$c->addProduct($apple);
$c->addProduct($orange);
$c->addProduct($banana);
$c->printProducts();
注意如何将两个实体分开并让 product
担心产品是什么以及可以做什么,以及类别是什么(名称)、有(产品)和可以做什么(打印列表其产品)。
解耦(最小化类之间的依赖性)的另一个技巧是,您应该尽可能长时间地让数据远离您的对象。上面示例中的类很简单但很实用。如果您可以使它们在没有数据库访问权限的情况下工作(这是拥有大量 extends
链的常见原因),您就会意识到这些类都不需要数据库访问权限,而是可以填充/创建它们通过有权访问数据库的类。像这样:
class category_factory {
public function __construct(PDO $pdo) { $this->pdo = $pdo; }
public function getCategories() {
$rows = $this->pdo->query("SELECT * FROM categories")->fetchAll();
$categories = array();
foreach($rows as $row) {
$categories[] = new category($row['name']);
}
return $categories;
}
}
* PDO包含数据库连接
关于php - 组织类(class) - 帮助 OOP 初学者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7481870/
我只想知道它们之间的区别: .class .class{ font-size:14px; } 对比: .class > .class{ font-size:14px; } 是一样的东西吗? 最佳答案
PrimeFaces 文档的以下摘录使标题中描述的两个选择器之间似乎存在差异: .ui-widget, .ui-widget .ui-widget { font-size: 90% !imp
我正在尝试选择特定值。但我遇到了一个问题。 我有两个元素,一个有 X Y,另一个有 X Y Z。 当选择 X Y Z 时,我也收到 X Y 的值...有没有办法让它寻找 X AND Y AND Z 而
.class.class 和 .class .class 有什么区别? 最佳答案 .class .class 匹配类 .class 的任何元素,这些元素是类 .class< 的另一个元素的后代/. .
我正在研究 Classname.class 和 Classname.class.toString() 并发现了一些不寻常的东西。 .class 在同一个类上运行时似乎等同于 .class。尽管 .cl
我试图在Dart中扩展列表并在此列表中使用另一个类。 这是我的示例,其中注释出了问题: import "Radio.dart"; // extends ListBase { List ra
我有一个很大的“经理”类,我认为它做得太多了,但我不确定如何将它划分为更多逻辑单元。 一般来说类主要由以下方法组成: class FooBarManager{ GetFooEntities();
我在一个文件中定义了一个抽象父类(super class),在另一个文件中定义了一个子类。我需要父类(super class)文件和堆栈跟踪报告来找到一个包含它。 但是,当它到达“extends”行时
我在 A. Alexenderscu 的现代 C++ 设计中找到了一些模板示例 作者使用以下行的地方 template class CheckingPolicy // class SmartPt
看一下这段代码: public static class A { public void doA() { } } public static class B extends A {
我有两个具有 .body 类的 div,但是,一个位于另一个具有 .box 类的 div 中 - 如下所示: 我只想为 .box 内部的 .body 设置样式...但我在下面所
我一定是遗漏了 C++ 规范中的某些内容,因为我无法解释为什么以下代码可以成功编译: class MyClass { static void fun(); }; int main() { MyClas
我正在尝试在 python 中“模拟”命名空间。我使用内部和外部类层次结构来创建我的命名空间。例如,您希望将文件(如资源)的路径保存在一个位置。我试过这样的事情: src = #path to sou
在试验 online crystal compiler 时(这太棒了),我遇到了一个我似乎无法找到解释的错误: class Person class Current < self end
在查看我的一段代码时,我陷入了如下的一条语句。 TMyObjectClass = TMyObject 类; 我有点困惑,不知道这句话是什么意思。由于 TMyObjectClass 在该语句上方没有声明
我正在编写一个简单的应用程序,以学习一些基本的Dart编程,但无法弄清楚其结构和包含的内容-我得到了一个重复的类Point 首先,我有一个叫做MouseTrack的主类。它将初始化列表并产生循环。 #
在 org.springframework.core.SerializableTypeWrapper (版本 5.2.3),第 112 行有以下代码: if (GraalDetector.in
我希望将鼠标悬停在子导航中的列表项上,以激活页面上该类别中所有项的类(不仅仅是父元素或同级元素)。有任何想法吗?这是我的意思的一个例子: img.BLUE {border:1px solid #FF
我正在通过 ClassLoader 加载类: Class clazz = urlClassLoader.loadClass(name.substring(0, name.length() - 6).r
以下简化的类在从 get() 返回值时执行不同的操作,具体取决于该类是被赋予 double 值还是数组作为模板参数: #include "array" #include "type_traits" t
我是一名优秀的程序员,十分优秀!