我想在ListActivity的构造函数中传递一些变量
我通过以下代码开始活动:
startActivity(new Intent (this, viewContacts.class));
Run Code Online (Sandbox Code Playgroud)
我想使用类似的代码,但要将两个字符串传递给构造函数.怎么可能?
叫我疯了,但我喜欢那种喜欢带参数的构造函数(如果需要)的人,而不是没有参数的构造函数,后跟设置属性.我的思考过程:如果需要实际构造对象的属性,它们应该进入构造函数.我有两个好处:
这种心态开始在形式/用户控制开发方面受到伤害.想象一下UserControl:
public partial class MyUserControl : UserControl
{
public MyUserControl(int parm1, string parm2)
{
// We'll do something with the parms, I promise
InitializeComponent();
}
}
Run Code Online (Sandbox Code Playgroud)
在设计时,如果我将其UserControl放在表单上,我得到一个Exception:
无法创建组件'MyUserControl'...
System.MissingMethodException - 没有为此对象定义的无参数构造函数.
对我来说,似乎唯一的办法是添加默认构造函数(除非其他人知道某种方式).
public partial class MyUserControl : UserControl
{
public MyUserControl()
{
InitializeComponent();
}
public MyUserControl(int parm1, string parm2)
{
// We'll do something with the parms, I promise
InitializeComponent();
}
}
Run Code Online (Sandbox Code Playgroud)
不包括无参数构造函数的重点是避免使用它.我甚DesignMode至无法使用该属性执行以下操作:
public partial class MyUserControl : UserControl …Run Code Online (Sandbox Code Playgroud) 我想检查运行时已知的类型是否提供无参数构造函数.这Type堂课并没有带来任何好处,所以我假设我必须使用反思?
第1,2,3,4行有什么区别?
我什么时候使用?
为什么第3行打印constructor Foo和第7行返回错误而第8行没有?
#include <iostream>
using namespace std;
class Foo
{
public:
Foo ( )
{
cout << "constructor Foo\n";
}
};
class Bar
{
public:
Bar ( Foo )
{
cout << "constructor Bar\n";
}
};
int main()
{
/* 1 */ Foo* foo1 = new Foo ();
/* 2 */ Foo* foo2 = new Foo;
/* 3 */ Foo foo3;
/* 4 */ Foo foo4 = Foo::Foo();
/* 5 */ Bar* bar1 = new Bar …Run Code Online (Sandbox Code Playgroud) 我已经放弃了所有希望能够在PHP中重载我的构造函数,所以我真正想知道的是为什么.
有没有理由呢?它是否会产生固有的错误代码?它是否被广泛接受的语言设计不允许它,或者其他语言比PHP更好?
所以说我有一个扩展超类的子类.在什么情况下我需要显式键入super()以运行超类构造函数?
我正在看一本关于抽象类的书中的例子,当他们用非抽象子类扩展它时,子类的默认构造函数是空白的,并且有一个注释表明将调用超类的默认构造函数.与此同时,我也看到过这里有人问题没有明确调用的情况super().
区别于从子类的默认/非默认构造函数调用超类的默认/非默认构造函数?
所以我最近一直在研究我的Java技能,并且发现了一些我之前不知道的功能.静态和实例初始化器是两种这样的技术.
我的问题是什么时候会使用初始化程序而不是在构造函数中包含代码?我想到了几个明显的可能性:
static/instance initializers可用于设置"final"静态/实例变量的值,而构造函数则不能
静态初始化程序可用于设置类中任何静态变量的值,这应该比在每个构造函数的开头具有"if(someStaticVar == null)// do stuff"代码块更有效
这两种情况都假设设置这些变量所需的代码比简单的"var = value"更复杂,否则似乎没有任何理由使用初始化器而不是在声明变量时简单地设置值.
然而,虽然这些并非微不足道的收益(特别是设置最终变量的能力),但似乎应该使用初始化程序的情况相当有限.
当然可以在构造函数中使用初始化器来完成很多工作,但我真的没有看到这样做的原因.即使一个类的所有构造函数共享大量代码,使用私有initialize()函数似乎比使用初始化程序更有意义,因为它不会阻止您在编写新代码时运行该代码构造函数.
我错过了什么吗?是否还有许多其他情况需要使用初始化程序?或者它是否真的只是在非常具体的情况下使用的相当有限的工具?
java constructor initializer static-initializer initialization-block
我刚刚意识到一些疯狂的东西,我认为这是完全不可能的:当反序列化一个对象时,DataContractSerializer不会调用构造函数!
以这门课为例,例如:
[DataContract]
public class Book
{
public Book()
{ // breakpoint here
}
[DataMember(Order = 0)]
public string Title { get; set; }
[DataMember(Order = 1)]
public string Author { get; set; }
[DataMember(Order = 2)]
public string Summary { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
当我反序列化该类的对象时,不会触发断点.我完全不知道它是如何可能的,因为它是这个对象的唯一构造函数!
我假设编译器可能因为DataContract属性而生成了额外的构造函数,但我无法通过反射找到它...
所以,我想知道的是:如何在不调用构造函数的情况下创建我的类的实例?
注意:我知道OnDeserializing在反序列化开始时我可以使用该属性初始化我的对象,这不是我的问题的主题.
class Person
{
public int age;
public Person()
{
age = 1;
}
}
class Customer : Person
{
public Customer()
{
age += 1;
}
}
Customer customer = new Customer();
Run Code Online (Sandbox Code Playgroud)
客户的年龄是2岁吗?似乎无论如何都会调用基类的构造函数.如果是这样,我们为什么base有时需要打电话?
public Customer() : base()
{
.............
}
Run Code Online (Sandbox Code Playgroud) 我们可以将代码放在构造函数或方法或初始化块中.初始化块有什么用?每个java程序都必须拥有它吗?
constructor ×10
c# ×4
java ×3
.net ×2
android ×1
base-class ×1
c++ ×1
class ×1
initializer ×1
oop ×1
overloading ×1
parameters ×1
php ×1
reflection ×1
subclass ×1
superclass ×1
types ×1
winforms ×1