【问题标题】:(OOP Technique) Inheritance vs. Interface --- same concept?--- (CSS Technique) styling tags vs. styling classes?(OOP 技术)继承与接口 --- 相同的概念?--- (CSS 技术)样式标签与样式类?
【发布时间】:2013-02-22 08:41:06
【问题描述】:

原谅那个疯狂的标题...

我试图理解面向对象编程中继承与接口的概念。所以我试图将它与我已经知道的东西联系起来,那就是 CSS。

在 CSS 中,您可以选择在允许元素“继承”样式的层次结构中设置样式:

(像 OOP 中的继承?)

    a   { color:red; text-decoration:underline; }
    p   { background:black; color:white; padding:20px; } 
    img { background:silver; padding:2px;  } 

或者,使用 .class 样式(这是一个更好的做法):

    .main-links      { color:red; text-decoration:underline; } 
    .main-paragraphs { background:black; color:white; padding:20px; }
    .main-images     { background:silver; padding:2px;  } 

(类似于 OOP 中的接口?)

我的问题是:

CSS 中的这个概念是否类似于继承与接口(针对 OOP)?还是我的想法完全错误。

【问题讨论】:

  • 在 OOP 中,类被声明(例如使用“class”关键字)并且可以继承多个类/接口,但每个分配的实例都与该类的每个其他实例完全相同。在 CSS 中,类实例(由“class”属性创建)可以继承独立的类集。 CSS 继承与 OOP 继承完全不同。

标签: css oop inheritance interface multiple-inheritance


【解决方案1】:

如果将 OOP 与 CSS 进行比较,您会发现可以将接口与样式进行比较,但 CSS 中没有继承。

OOP 中的接口几乎就像将类应用于元素一样。就像您可以向一个元素添加多个类以组合不同的外观一样,您可以向一个类添加多个接口以组合不同的行为。

如果你在 CSS 中有继承,它会是这样的:

.main-links { color: red; }

.info-links { @inherits: .main-links; font-weight: bold; }

这里的一个规则将继承另一个规则,因此您可以只将类 info-links 应用到一个元素,以获得 main-links 的实现。

(当然这在 CSS 中是行不通的,因为规则没有名称,只有选择器,选择器甚至不必是唯一的,因此它们不能用于标识规则。)

【讨论】:

  • 当您说“在 css 中没有像继承这样的东西”时,我有点难以理解您,因为这是我在比较 OOP 和 CSS 时感到的一个概念。看看我刚刚放在一起的这个小提琴jsfiddle.net/GV2QX/2,当考虑到类的父子继承时,元素的父子继承似乎也是如此。
  • @MrRioku:是的,如果您将 HTML 层次结构视为类继承,那么 CSS 级联将类似于继承类成员。
【解决方案2】:

简答:你有完全错误的想法。 绝对没有办法可以使用 CSS 向您解释 OOP 继承/接口。

继承和接口是编程概念(非常基本的设计模式),而 CSS 不是编程语言(不是图灵完备的)。

网上有很多非常易于理解的教程/文章,可以让您很好地理解这两个概念。我建议你阅读它们。

编辑:嗯,再想一想,也许,只是也许,继承可以有点用 CSS 来解释。就像 CSS 中的样式属性级联一样,类方法和属性“级联”到派生类。但是,您最好阅读介绍性教程,而不是尝试通过 CSS 理解这些概念。

【讨论】:

  • 我完全理解 CSS 不是一种编程语言 ;) ,但是级联样式的艺术是 OOP 中类似的继承概念。接口是真正让我陷入困境的东西。就像 OOP 中的接口一样,您可以为某些要使用的类定义“通用方法”(对吗?),就像 CSS 类一样,您可以定义“通用样式”。既然这么说,还能不能一视同仁?
  • OOP 中使用继承和接口来实现多态性,这是 CSS 中不存在的概念。接口不仅仅是定义“通用方法”。如果是这种情况,您可以使用组合、继承、单例等来实现。
  • 好吧,一方面 css 实际上是图灵完备的,另一方面图灵完备与继承或编程语言无关。