GVKun编程网logo

OOP PHP – 如何有选择地调用类的构造函数中定义的特定方法?(调用其他类的构造方法)

11

对于OOPPHP–如何有选择地调用类的构造函数中定义的特定方法?感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解调用其他类的构造方法,并且为您提供关于android-如何在不同的类之间共享相

对于OOP PHP – 如何有选择地调用类的构造函数中定义的特定方法?感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解调用其他类的构造方法,并且为您提供关于android-如何在不同的类之间共享相同的构造函数,又在接口中定义构造函数?、C – 如何从类的构造函数初始化单独类的构造函数?、c – 如何继承构造函数,或者如何调用具有未知数量参数的构造函数?、c – 定义的构造函数的“未定义引用”的宝贵知识。

本文目录一览:

OOP PHP – 如何有选择地调用类的构造函数中定义的特定方法?(调用其他类的构造方法)

OOP PHP – 如何有选择地调用类的构造函数中定义的特定方法?(调用其他类的构造方法)

我正在学习用OOP方式编写wordpress Multisite,因为我现在对OOP很新,我现在处于一种我似乎无法自己解决的问题.

具体来说,我正在创建一些类来使用OOP方法创建管理页面(在网络和子网站级别).这是我的简化代码:

class AdminPage {

    public function __construct( $args ) {
        add_action( 'admin_menu',array( $this,'add_admin_page' ) );
    }

    public function add_admin_page() {
        add_menu_page( // arguments );
    }

}

class AdminNetworkPage extends AdminPage {

    public function __construct( $args ) {
        add_action( 'network_admin_menu','add_admin_page' ) );
     }

}

代码可以工作,但正如您所看到的,我必须扩展AdminPage类,其唯一目的是更改构造函数中的钩子(我需要admin_network_menu用于网络级别的管理页面而不是admin_menu).

有一个更好的方法吗?有一个类的方法,将两个钩子放在该类的构造函数中,然后选择性地调用其中一个?

不幸的是,创建一个新的类实例($page = new AdminPage),然后在其上调用一个方法(例如$page-> add_admin_page())在这种情况下不起作用,因为我得到一个错误说add_menu_page未定义……这一切都必须在构造函数中发生.

解决方法

你可以这样做:

class AdminPage {

    public function __construct( $args,$networkPage = false ) {

        if($networkPage) {

            add_action( 'network_admin_menu','add_admin_page' ) );

        } else {

            add_action( 'admin_menu','add_admin_page' ) );

        }

    }

    public function add_admin_page() {

        add_menu_page( // arguments );

    }
}

然后将第二个参数传递给类以更改您添加的操作,例如

$page = new AdminPage($args);
$networkPage = new AdminPage($args,true);

这是否比扩展课程更好是有争议的;我个人认为你的初始设置没有任何问题,OOP的重点不是创建尽可能少的类 – 如果你的代码作为两个单独的类(一个扩展另一个)更有意义,那么这没有什么问题.

android-如何在不同的类之间共享相同的构造函数,又在接口中定义构造函数?

android-如何在不同的类之间共享相同的构造函数,又在接口中定义构造函数?

假设我在Android中使用相同的构造函数有多个自定义视图

class Button: AppCompatButton {

    constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle) {
    }

    constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {
    }

    constructor(context: Context) : super(context) {
    }
    //Some custom implementation
    //............
}

class TextView: AppCompatTextView {

    constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle) {
    }

    constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {
    }

    constructor(context: Context) : super(context) {
    }
    //Some custom implementation
    //............
}

所以我需要一些接口或基类,这些接口或基类可以让我继承多个视图,例如TextView,Button,EditText等.

就像是

abstract class BaseView<T : View> : T {
    constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle) {
    }

    constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {
    }

    constructor(context: Context) : super(context) {
    }
}

要么

interface ViewConstructor {
    constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle) {
    }

    constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {
    }

    constructor(context: Context) : super(context) {
    }
}

所以我只使用一个接口或基类,而不是一次又一次地复制过去的承包商.如何在Kotlin中实现这一目标?

附言请不要建议将基类用作View并使用基类创建派生视图.我正在使用XML,因此需要EditText,Button和其他视图.

解决方法:

编辑:我偶然发现了这个答案,它需要更新.在某些自定义视图中,使用@JvmOverloads可能是一个问题,因为调用为您自己的类生成的任何构造函数都将首先委托给该类中的all-params构造函数,然后再调用super的all-params构造函数,而不是每个构造函数以匹配的参数数量调用super方法.有关详细信息,请参见this article(例如).

以下是我的回答的原文.

作为必须编写许多构造函数的解决方案,您可以将默认参数与@JvmOverloads结合使用,以轻松获取所有4个View构造函数,而仅为类编写一个主要构造函数:

class CustomView @JvmOverloads constructor(
        context: Context,
        attrs: AttributeSet? = null,
        defStyleAttr: Int = 0,
        defStyleRes: Int = 0
) : View(context, attrs, defStyleAttr, defStyleRes) {

}

C – 如何从类的构造函数初始化单独类的构造函数?

C – 如何从类的构造函数初始化单独类的构造函数?

基本上我想要实现的是在类geneticIngorithm中创建类deltaKinematics的本地(和私有)实例

在geneticAlgorithm.h文件中,我有:

class DeltaKinematics; //class is defined in separate linked files

class geneticAlgorithm {
  //private  
    DeltaKinematics delTarobot;

public:

    geneticAlgorithm(); //constructor

};

这很好,但是当我去声明geneticAlgorithm构造函数时,我无法弄清楚如何构造DeltaKinematics的实例

这是geneticAlgorithm.cpp构造函数:

geneticAlgorithm::geneticAlgorithm(){ //The error given on this line is "constructor for 'geneticAlgorithm' must explicitly initialize the member 'delTarobot' which does not have a default constructor"

    DeltaKinematics delTarobot(100); //this clearly isn't doing the trick

    cout << "genetic Algorithmic search class initiated \n";
}

如何初始化该本地实例?

解决方法

成员初始化列表:
geneticAlgorithm::geneticAlgorithm() : delTarobot(100) {
}

c – 如何继承构造函数,或者如何调用具有未知数量参数的构造函数?

c – 如何继承构造函数,或者如何调用具有未知数量参数的构造函数?

我正在尝试编写一个方便使用的构造函数类似于printf的异常类,例如:

class ExcBase
{
    ExcBase(const char *fmt,...)
    {
        // call things like vsprintf
    }
};

但是在c中似乎没有构造的继承,所以我想编写一个继承的类,如:

class ExcChild : public ExcBase
{
    ExcChild(const char *fmt,...)
       : ExcBase(fmt,...) // XXX: how to pass the trailing parameters to the constructor?
    {
    }
};

或者我将不得不为所有子类编写相同的构造函数,这太烦人了……

这个问题困扰了我很多,我无法找到解决这个问题的方法……
任何信息都将是一个很大的帮助……

解决方法

如果将复杂的工作分离为带有va_list参数的函数,则应该能够从每个子构造函数(对于每个子类型仍然必须实现)中调用它.然后你的重复代码(每个类)只是声明va_list,然后调用va_start,你的新(基本)函数和va_end.这样做有 a post here on SO个.

c – 定义的构造函数的“未定义引用”

c – 定义的构造函数的“未定义引用”

我有一个构造函数,其签名是这样的:
cpuInput (const std::string &label);

实际的构造函数使用引用超构造函数的初始化列表,所以它看起来像这样:

cpuInput::cpuInput (const string &label) : StateMonitor::input(label) { }

该类编译为目标文件.如果我将该文件与调用构造函数的驱动程序一起编译:

cpuInput *cpu = new cpuinput();

当然我从g得到一个错误:

demo.cpp:15:31: error: no matching function for call to ‘cpuInput::cpuinput()’
demo.cpp:15:31: note: candidates are:
In file included from demo.cpp:3:0:
input_cpusage/cpuInput.hpp:7:3: note: cpuInput::cpuInput(const string&)

现在这里是奇怪的部分:如果我将构造函数调用更改为:

cpuInput *cpu = new cpuInput("cpu");

并将其他所有内容保持不变,我现在得到:

demo.cpp:15: undefined reference to `cpuInput::cpuInput(std::string const&)'

我意识到const string&与字符串const&并不完全相同,但我原以为这是在C中传递字符串引用(在这种情况下,通过从const char *转换)的标准方法,并且:

class A {
    public:
        A (const string &s) : x(s) { cout << x << endl; }
    private:
        const string x;
};

class B : A {
    public:
        B (const string &s) : A(s) { }
};

int main (void) {
    new B("test");
    return 0;
}

不重现这个问题,虽然它似乎与我相同的WRT相关元素.

那么为什么一方面会说:

candidates are … cpuInput::cpuInput(const string&)

然后到新的cpuInput(“string”)说:

undefined reference to `cpuInput::cpuInput(std::string const&)

解决方法

对于后代,问题在于我在头文件中定义了超类构造函数(和析构函数) – 超类是纯虚拟的.毫无疑问,这是一个常见的C新手错误.

这意味着虽然编译和链接派生类,但超类却没有.由于派生类被编译为.o,编译器并不关心,但在调用派生类构造函数的可执行文件中使用该.o会产生链接器错误:

undefined reference to subclass::subclass(...)

虽然从根本上未定义的是超类::超类().

作为注释,如果将其声明为虚拟,则还必须编译超类析构函数的定义.

今天关于OOP PHP – 如何有选择地调用类的构造函数中定义的特定方法?调用其他类的构造方法的分享就到这里,希望大家有所收获,若想了解更多关于android-如何在不同的类之间共享相同的构造函数,又在接口中定义构造函数?、C – 如何从类的构造函数初始化单独类的构造函数?、c – 如何继承构造函数,或者如何调用具有未知数量参数的构造函数?、c – 定义的构造函数的“未定义引用”等相关知识,可以在本站进行查询。

本文标签: