您不能在PHP类中放置两个带有唯一参数签名的__construct函数.我想这样做:
class Student
{
protected $id;
protected $name;
// etc.
public function __construct($id){
$this->id = $id;
// other members are still uninitialized
}
public function __construct($row_from_database){
$this->id = $row_from_database->id;
$this->name = $row_from_database->name;
// etc.
}
}
Run Code Online (Sandbox Code Playgroud)
在PHP中执行此操作的最佳方法是什么?
假设我有一个带有多个构造函数的Java类:
class Base {
Base(int arg1) {...};
Base(String arg2) {...};
Base(double arg3) {...};
}
Run Code Online (Sandbox Code Playgroud)
如何在Scala中扩展它并仍然提供对Base的所有三个构造函数的访问?在Scala中,子类只能调用其中一个超类的构造函数.我该如何解决这条规则?
假设Java类是我无法更改的遗留代码.
假设我有一个不可复制的类,其中包含多个类似的构造函数
class Foo: boost::noncopyable
{
public:
Foo(std::string s) {...}; // construct one way
Foo(int i) {...}; // construct another way
}
Run Code Online (Sandbox Code Playgroud)
现在,我想构造一个对象,并选择在运行时使用哪个构造函数:
我可以用这样的指针做到: -
boost::shared_ptr<Foo> f;
if (condition)
f.reset(new Foo(myString));
else
f.reset(new Foo(myInteger));
// common code follows
f->doSomethingComplicated(...);
Run Code Online (Sandbox Code Playgroud)
但这感觉很麻烦而且很慢.是否有一种简单的方法可以选择对象的构造函数而无需动态分配?
更多细节:Foo上面的类只是为了说明问题.涉及的实际类是Windows Gdiplus::Bitmap- http://msdn.microsoft.com/en-gb/library/windows/desktop/ms534420(v=vs.85). ASPX
我通过关键字在谷歌尝试了许多解决方案:多个构造函数,scala,继承,子类.
似乎没有人适合这个场合.ImageView有三个构造函数:
ImageView(context)
ImageView(context,attribute set)
ImageView(context,attribute set, style)
Run Code Online (Sandbox Code Playgroud)
在scala中,您只能扩展其中一个.使用更完整的构造函数(ImageView(context,attribute set, style))并传递默认值的解决方案也不起作用,因为构造函数ImageView(context)执行的操作与其他两个构造函数完全不同.
使用特征或伴随对象的一些解决方案似乎不起作用,因为CustomView必须是一个类!我的意思是我不是唯一一个使用这个类的人(所以我可以按照我想要的方式编写scala代码)还有使用这个类的android-sdk,是的,它必须是一个类.
target是一个扩展ImageView的CustomView,所有这些工作:
new CustomView(context)
new CustomView(context,attribute set)
new CustomView(context,attribute set, style)
Run Code Online (Sandbox Code Playgroud)
如果您需要进一步澄清这个棘手的问题,请告诉我!
假设我有类似的课程
class A{
public:
A(int a, boost::shared_ptr<int> ptr){
// whatever!
}
};
Run Code Online (Sandbox Code Playgroud)
我的问题是,该ptr的默认值是多少?我希望能够使用创建该类的实例
A myA(5);
Run Code Online (Sandbox Code Playgroud)
当然我知道我可以用一个参数创建另一个构造函数,但我正在寻找类似的东西
A(int a, boost::shared_ptr<int> ptr = WAT?)
Run Code Online (Sandbox Code Playgroud)
可能吗?目前我正在使用双构造方式,但这样做会很棒.
我开始使用MEF,我有一个包含多个构造函数的类,如下所示:
[Export(typeof(ifoo))]
class foo : ifoo {
void foo() { ... }
[ImportingConstructor]
void foo(object par1) { ... }
}
Run Code Online (Sandbox Code Playgroud)
我catalog.ComposeExportedValue()在编写时使用它来par1
为第二个构造函数提供值:
...
catalog.ComposeExportedValue(par1Value);
catalog.ComposeParts(this);
...
Run Code Online (Sandbox Code Playgroud)
要保存我正在使用的组件:
[ImportMany(typeof(ifoo))]
public List<Lazy<ifoo, ifoometadata>> FooList { get; set; }
Run Code Online (Sandbox Code Playgroud)
为了创建foo我正在使用value属性的实例,FooList[0].Value.
Everthing工作正常,但从foo不调用类的第二个构造函数.怎么了?
当MEF实例化类时,如何选择我想要使用的构造函数?
鉴于有限数量的项目有所不同,用堆叠的枚举和枚举构造函数表示它们还是将它们子类化更好?或者是否有更好的方法?
为了给你一些背景,在我的小RPG程序中(具有讽刺意味的是简单),角色在他或她的库存中有不同种类的物品.项目因类型,用途和效果而异.
例如,一个库存项目是一个名为Gremlin的拼写滚动,用于调整Utility属性.另一件物品可能是一把名为Mort的剑,用于战斗并造成伤害.
在我的RPG代码中,我现在尝试了两种表示库存项目的方法.一个办法是子类(例如,InventoryItem - >拼写 - > AdjustingAttributes; InventoryItem - >武器 - >剑)并在需要时实例化每个子类,以及诸如像的Gremlin和莫特名称分配值.
另一种方法是堆叠枚举和枚举构造函数.例如,我为itemCategory和itemSpellTypes以及itemWeaponTypes创建了枚举,而InventoryItem枚举是这样的:
public enum InventoryItem {
GREMLIN(itemType.SPELL, itemSpellTypes.ATTRIBUTE, Attribute.UTILITY),
MORT(itemType.WEAPON, itemWeaponTypes.SWORD, 30);
InventoryItem(itemType typeOfItem, itemSpellTypes spellType, Attribute attAdjusted) {
// snip, enum logic here
}
InventoryItem(itemType typeOfItem, itemWeaponTypes weaponType, int dmg) {
// snip, enum logic here
}
// and so on, for all the permutations of items.
}
Run Code Online (Sandbox Code Playgroud)
是否有比这两种方法更好的Java编程实践?或者,如果这些是唯一的方式,哪两个更好?提前感谢您的建议.
似乎没有用于指定this()和base()构造函数的语言语法.给出以下代码:
public class Bar : Foo
{
public Bar()
:base(1)
//:this(0)
{ }
public Bar(int schmalue)
:Foo(1)
{
//Gobs of initialization code
...
Schmalue = schmalue;
}
public int Schmalue { get; private set; }
}
public class Foo
{
public Foo()
{
Value = 0;
}
public class Foo(int value)
{
Value = value;
}
public int Value { get; private set; }
}
Run Code Online (Sandbox Code Playgroud)
编译器给出了一个错误,指出在取消注释:this(0)调用时预期'{'.这很麻烦,因为它导致我将我的代码分解为私有方法,当明确提供此功能以防止这样的事情.
我只是做错了吗?我试过没有分隔符,分号,逗号......这似乎只是开发团队的疏忽.我很感兴趣为什么这个被省略了,如果我以错误的方式解决这个问题,或者是否有人对替代方案提出了很好的建议.
在C#中关于构造函数的继承:
这些陈述是否更正?
如何实现可以接受不同数量参数的php构造函数?
喜欢
class Person {
function __construct() {
// some fancy implementation
}
}
$a = new Person('John');
$b = new Person('Jane', 'Doe');
$c = new Person('John', 'Doe', '25');
Run Code Online (Sandbox Code Playgroud)
在php中实现这个的最佳方法是什么?
谢谢,米洛
constructor ×4
.net ×3
boost ×2
c# ×2
c++ ×2
inheritance ×2
java ×2
php ×2
scala ×2
android ×1
enums ×1
mef ×1
noncopyable ×1
subclassing ×1