Javascript的主要优势之一是据说这是一个基于原型的语言。 但是,这是什么意思,Javascript是基于原型的,为什么这是一个优势?
所以这些年我终于停下脚步,决定正确地学习JavaScript。 语言devise中最令人头疼的元素之一就是inheritance的实现。 有了Ruby的经验,我很高兴看到closures和dynamicinput; 但是对于我的生活来说,无法弄清楚使用其他实例进行inheritance的对象实例有什么好处。
我是Java编程的新手,试图获得OOP的悬念。 所以我build立了这个抽象类: public abstract class Vehicle{….} 和2个子类: public class Car extends Vehicle{….} public class Boat extends Vehicle{….} Car和Boat还拥有一些不常见的独特的领域和方法(不具有相同的名称,所以我不能在车辆中定义它们的抽象方法)。 现在在mainClass中,我已经安装了新的Garage: Vehicle[] myGarage= new Vehicle[10]; myGarage[0]=new Car(2,true); myGarage[1]=new Boat(4,600); 我对多态性非常满意,直到我试图访问Car独有的一个字段,比如: boolean carIsAutomatic = myGarage[0].auto; 编译器不接受这个。 我使用cast来解决这个问题: boolean carIsAutomatic = ((Car)myGarage[0]).auto; 这工作…但它不能帮助方法,只是字段。 这意味着我做不到 (Car)myGarage[0].doSomeCarStuff(); 所以我的问题是 – 我的车库里真的有什么? 我试图去理解直觉,了解“幕后”是怎么回事。 为了未来的读者,下面给出一个简短的答案: 是的,我的myGarage[]有一辆Car 作为静态types语言,如果通过基于Vehicle超类的数据结构(如Vehicle myGarage[] )访问这些语言,Java编译器将不会访问非“Vehicle”的方法/字段 至于如何解决,主要有两种方法: 使用types转换,这将缓解编译器的问题,并在devise中留下任何错误来运行时间 我需要铸造的事实说,devise是有缺陷的。 如果我需要访问非车辆function,那么我不应该将汽车和船存储在基于车辆的数据结构中。 要么使所有这些function属于Vehicle,要么使用更具体的(派生的)基于types的结构 […]
首先…对不起这个职位。 我知道有很多post在stackoverflow讨论多重inheritance。 但是我已经知道Java不支持多重inheritance,而且我知道使用接口应该是另一种select。 但我不明白,看到我的困境: 我必须对用Java编写的非常大而复杂的工具进行更改。 在这个工具中,有一个由许多不同类对象和一个链接的成员层次结构构成的数据结构。 无论如何… 我有一个类Tagged有多个方法,并根据对象的类返回一个对象标记。 它需要成员和静态variables。 另一个称为XMLElement类允许链接对象,最后生成一个XML文件。 我也需要这里的成员和静态variables。 最后,我有这么多的数据类,几乎所有的应该扩展XMLElement和一些Tagged 。 好吧,这是行不通的,因为只能扩展一个类。 我经常读到,所有使用Java的东西都可以,并且不需要多重inheritance。 我相信,但我不明白接口应该如何取代inheritance。 把所有数据类中的真实实现放在一起是没有意义的,因为它每次都是一样的,但是这对接口是必须的(我认为)。 我没有看到我怎么可以改变我的inheritance类之一到一个接口。 我在这里有variables,他们必须在那里。 我真的不明白,所以请有人解释我如何处理这个?
我有两个class级父母和孩子 public class Parent { public Parent() { System.out.println("Parent Constructor"); } static { System.out.println("Parent static block"); } { System.out.println("Parent initialisation block"); } } public class Child extends Parent { { System.out.println("Child initialisation block"); } static { System.out.println("Child static block"); } public Child() { System.out.println("Child Constructor"); } public static void main(String[] args) { new Child(); } […]
我知道这个问题以前已经讨论过了 ,但是总是认为inheritance至less有时比组合更好。 我想挑战这个假设,希望得到一些理解。 我的问题是这样的: 因为你可以完成任何东西与对象组成,你可以用古典inheritance,因为古典inheritance经常被滥用[1] ,因为对象组成给你灵活地改变委托对象的运行时, 为什么你会用古典inheritance? 我可以理解为什么你会推荐一些像Java和C ++这样的语言来inheritance,这些语言没有提供方便的委托语法。 在这些语言中,只要不明显不正确,就可以使用inheritance来节省大量的input。 但是像Objective C和Ruby这样的其他语言既可以提供经典的inheritance,也可以为委派提供非常方便的语法。 Go编程语言是我所知的唯一的语言决定古典inheritance是比它的价值更麻烦,并且只支持委托代码重用。 另一种表述我的问题的方法是:即使你知道古典inheritance不是不正确的实现一个特定的模型,是否有足够的理由来使用它,而不是组成? [1]许多人使用经典的inheritance来实现多态,而不是让他们的类实现一个接口。 inheritance的目的是代码重用,而不是多态。 此外,有些人使用inheritance来模拟他们对“一个”的关系的直观理解,这个关系往往是有问题的 。 更新 我只是想澄清我的意思,当我谈论inheritance: 我正在谈论一种类inheritance,从一个部分或完全实现的基类inheritance 。 我并不是在谈论从一个纯粹的抽象基类inheritance,这个基类和实现一个接口是一样的,而我所logging的这个接口并不是反对的。 更新2 我知道inheritance是实现C ++多态性的唯一方法。 在这种情况下,很显然你必须使用它。 所以我的问题仅限于诸如Java或Ruby之类的语言,它们提供了实现多态的独特方法(分别为接口和鸭子打字)。
我有两个项目:父项目:A,子项目:B 在A / pom.xml中: <groupId>com.dummy.bla</groupId> <artifactId>parent</artifactId> <version>0.1-SNAPSHOT</version> <packaging>pom</packaging> 在B / pom.xml中,我有: <parent> <groupId>com.dummy.bla</groupId> <artifactId>parent</artifactId> <version>0.1-SNAPSHOT</version> </parent> <groupId>com.dummy.bla.sub</groupId> <artifactId>kid</artifactId> 我想Binheritance父母的版本,所以我需要把0.1-SNAPSHOT的唯一的地方是A/pom.xml 。 但是,如果我从父节中的B/pom.xml删除<version>0.1-SNAPSHOT</version> ,maven会抱怨父节点的缺失版本。 有没有办法,我可以使用${project.version}或类似的东西,以避免在两个poms 01.-SNAPSHOT ?
我创build了一个如下的对象。 var BaseObject = function(){ var base = this; base.prop; base.setProp = function(val){ base.prop = val; } } 当我调用setProp方法时,我得到以下内容。 var a = new BaseObject(); var b = new BaseObject(); a.setProp("foo"); b.setProp("bar"); console.log(a.prop); // outputs 'foo' console.log(b.prop); // outputs 'bar' 然后我创build了另一个inheritance自BaseObject对象。 var TestObject = function(){ // do something } TestObject.prototype = new BaseObject(); 当我这样做时,我得到了一个我并不期待的结果。 var a […]
考虑以下层次结构: struct A { int a; A() { f(0); } A(int i) { f(i); } virtual void f(int i) { cout << i; } }; struct B1 : virtual A { int b1; B1(int i) : A(i) { f(i); } virtual void f(int i) { cout << i+10; } }; struct B2 : virtual A […]
function a () { return "foo"; } ab = function () { return "bar"; } function c () { }; c.prototype = a; var d = new c(); db(); // returns "bar" d(); // throws exception, d is not a function 有没有什么方法可以成为一个函数,但仍然inheritance属性?