我一直在注意__construct
课程.我做了一些阅读和网上冲浪,但我找不到我能理解的解释.我刚刚开始使用OOP.
我想知道是否有人可以给我一个大概它是什么,然后一个简单的例子,它如何与PHP一起使用?
我需要在PHP中使用类构造函数调用其父级的父级(祖父级?)构造函数而不调用父构造函数.
// main class that everything inherits
class Grandpa
{
public function __construct()
{
}
}
class Papa extends Grandpa
{
public function __construct()
{
// call Grandpa's constructor
parent::__construct();
}
}
class Kiddo extends Papa
{
public function __construct()
{
// THIS IS WHERE I NEED TO CALL GRANDPA'S
// CONSTRUCTOR AND NOT PAPA'S
}
}
Run Code Online (Sandbox Code Playgroud)
我知道这是一件很奇怪的事情,我试图找到一种味道并不难闻的手段但是,我很好奇是否有可能.
编辑
我想我应该发布所选答案的理由.原因是; 它是最优雅的解决方案,希望在保留所有值的同时调用"祖父母"的构造函数.它当然不是最好的方法,也不是OOP友好的,但这不是问题的问题.
对于以后遇到此问题的任何人 - 请找到另一种解决方案.我能够找到一种更好的方法,不会对类结构造成严重破坏.你也应该这样.
为什么可以在C#中为抽象类编写构造函数?
据我所知,我们无法实例化一个抽象类..那么它的用途是什么?
你无法实例化这个类,对吧?
有没有什么好的理由在C++中调用默认构造函数时,一组空的圆括号(括号)无效?
MyObject object; // ok - default ctor
MyObject object(blah); // ok
MyObject object(); // error
Run Code Online (Sandbox Code Playgroud)
我似乎每次都自动输入"()".是不是有一个很好的理由不允许这样做?
c++ constructor c++-faq default-constructor most-vexing-parse
想象一下具有许多构造函数和虚方法的基类
public class Foo
{
...
public Foo() {...}
public Foo(int i) {...}
...
public virtual void SomethingElse() {...}
...
}
Run Code Online (Sandbox Code Playgroud)
现在我想创建一个覆盖虚方法的后代类:
public class Bar : Foo
{
public override void SomethingElse() {...}
}
Run Code Online (Sandbox Code Playgroud)
而另一个后代做了更多的东西:
public class Bah : Bar
{
public void DoMoreStuff() {...}
}
Run Code Online (Sandbox Code Playgroud)
我是否真的必须将所有构造函数从Foo复制到Bar和Bah?然后,如果我在Foo中更改构造函数签名,我是否必须在Bar和Bah中更新它?
有没有办法继承构造函数?有没有办法鼓励代码重用?
我想知道为什么java构造函数不会被继承?你知道什么时候有这样的课:
public class Super {
public Super(ServiceA serviceA, ServiceB serviceB, ServiceC serviceC){
this.serviceA = serviceA;
//etc
}
}
Run Code Online (Sandbox Code Playgroud)
稍后当你继承时Super
,java会抱怨没有定义默认的构造函数.解决方案显然是这样的:
public class Son extends Super{
public Son(ServiceA serviceA, ServiceB serviceB, ServiceC serviceC){
super(serviceA,serviceB,serviceC);
}
}
Run Code Online (Sandbox Code Playgroud)
这段代码是重复的,而不是干的和无用的(恕我直言)...所以这又带来了问题:
为什么java不支持构造函数继承?不允许这种继承有什么好处吗?
我试图从我的渲染视图重构以下代码:
<Button href="#" active={!this.state.singleJourney} onClick={this.handleButtonChange.bind(this,false)} >Retour</Button>
Run Code Online (Sandbox Code Playgroud)
到绑定在构造函数中的版本.原因是渲染视图中的绑定会给我带来性能问题,特别是在低端手机上.
我创建了以下代码,但我不断收到以下错误(很多错误).看起来应用程序进入循环:
Warning: setState(...): Cannot update during an existing state transition (such as within `render` or another component's constructor). Render methods should be a pure function of props and state; constructor side-effects are an anti-pattern, but can be moved to `componentWillMount`.
Run Code Online (Sandbox Code Playgroud)
以下是我使用的代码:
var React = require('react');
var ButtonGroup = require('react-bootstrap/lib/ButtonGroup');
var Button = require('react-bootstrap/lib/Button');
var Form = require('react-bootstrap/lib/Form');
var FormGroup = require('react-bootstrap/lib/FormGroup');
var Well = require('react-bootstrap/lib/Well');
export default class Search extends React.Component {
constructor() …
Run Code Online (Sandbox Code Playgroud) 我是JavaScript OOP的新手.你能解释下面的代码块之间的区别吗?我测试了两个块都有效.什么是最佳实践,为什么?
第一块:
function Car(name){
this.Name = name;
}
Car.prototype.Drive = function(){
console.log("My name is " + this.Name + " and I'm driving.");
}
SuperCar.prototype = new Car();
SuperCar.prototype.constructor = SuperCar;
function SuperCar(name){
Car.call(this, name);
}
SuperCar.prototype.Fly = function(){
console.log("My name is " + this.Name + " and I'm flying!");
}
var myCar = new Car("Car");
myCar.Drive();
var mySuperCar = new SuperCar("SuperCar");
mySuperCar.Drive();
mySuperCar.Fly();
Run Code Online (Sandbox Code Playgroud)
第二块:
function Car(name){
this.Name = name;
this.Drive = function(){
console.log("My name is " + this.Name + …
Run Code Online (Sandbox Code Playgroud)javascript oop inheritance constructor prototype-programming
默认构造函数(由编译器创建)是否初始化内置类型?
c++ constructor initialization default-constructor built-in-types
constructor ×10
inheritance ×4
c# ×3
c++ ×2
oop ×2
php ×2
c++-faq ×1
class ×1
java ×1
javascript ×1
reactjs ×1
setstate ×1