如何在php中更改参数类型来设计继承?

时间:2010-01-28 22:54:33

标签: php design-patterns inheritance types hints

这个想法是创建一个类似DOM的树。但是有一些限制,只有某些类型实际上可以包含另一种类型。

我想使用接口|抽象类|超类来实现一些众所周知的js函数如appendChild,replaceChild等。

我正在使用类页面,块和项目,其中页面可以包含块,块可以包含块或项目。

示例:Page是一个网页,block可以是list元素,item可以是list item元素。

但是这些对象不仅包含html数据,而且概念不仅仅是简单的HTML表示。 这是管理项目的总体思路,他们有实际的表现形式,或者只是抽象的对象。该概念本身适用于许多不同的层次结构。

我想要实现的是尽可能多地重用父类的代码(为所有类添加一个子元素基本相同)但是要使类型提示不同以匹配允许添加为子类的类型。< / p>

我基本上有四种方法可以找到自己:

  1. 我使用了一个接口,它允许我输入超类的提示,但不能更改这些。
  2. 我使用带有公共方法的超类,所以我可以重新定义类型提示(这在完成预设条件时完全违反了常规做法)。
  3. 我使用带有受保护方法的超类,这似乎仍然非常古怪。
  4. 我摆脱了任何超类,只是几次定义了几乎相同的类。
  5. 我使用一种方法来检查类型,尽管有类型提示的功能。
  6. 所以,如果有人仍然愿意回答我很高兴任何提议,想法或提示,选择哪个选项。我希望我能够很好地描述这个问题。

    如果有什么我错过了,我很感激听到它;)

    代码

    超级方式(有效,但打破前提条件继承练习)

    class Base {
    
        public|protected function appendChild(Base $child) {
            // do stuff
        }
    }
    
    class Block extends Base {
    
       public function appendChild(Block $child) {
           parent::appendChild($child);
       }
    
    }
    

    接口方式(不起作用。一定不能)

    interface Interface1 {
    
        public function appendChild(Base $child);
    
    }
    
    class Base implements Interface1 {
    
        public|protected function appendChild(Base $child) {
            // do stuff
        }
    }
    
    class Block extends Base{
    
       public function appendChild(Block $child) {
           parent::appendChild($child);
       }
    
    }
    

    编辑的部分为粗体

1 个答案:

答案 0 :(得分:0)

界面对我来说最有意义。您可以拥有一个扮演多个角色的类,因为它可以实现多个接口。

// you don't need any methods in the interfaces
class Foo implements Inline, Block {} 

将同时适用于:

appendChild(Inline $foo); and appendChild(Block $foo);

和接口可以相互扩展,因此可以为所有对象提供通用接口。

您仍然可以使用继承来重用实现,并且您可以灵活地使用inhertiance树来严格重用实现,而不受页面逻辑的限制(您永远不会被迫StaticSimpleton扩展{ {1}})。

如果不是界面,我会选择选项5:只需拨打HeavyDatabaseyWidget来拨打appendChild和/或$child->canBeChildOf($this)。同样,逻辑和实现将是独立的,你的逻辑将有很多自由。

PHP在运行tmie时会进行类型检查,所以使用类型系统并不会给你带来太多帮助。