我的代码是
public class Parent
{
public Parent(int i)
{
Console.WriteLine("parent");
}
}
public class Child : Parent
{
public Child(int i)
{
Console.WriteLine("child");
}
}
Run Code Online (Sandbox Code Playgroud)
我收到错误:
Parent不包含带0参数的构造函数.
我理解问题是Parent
没有带0参数的构造函数.但我的问题是,为什么我们需要一个零参数的构造函数?没有它,为什么代码不工作?
我在解决界面中定义构造函数的工作方式时遇到了一些麻烦.我可能完全误解了一些事情.但是我已经寻找了很长一段时间的答案,我找不到与此相关的任何内容.
如何在TypeScript类中实现以下接口:
interface MyInterface {
new ( ... ) : MyInterface;
}
Run Code Online (Sandbox Code Playgroud)
Anders Hejlsberg在此视频中创建了一个包含类似内容的界面(大约14分钟).但对于我的生活,我无法在课堂上实现这一点.
我可能误解了一些事情,我没有得到什么?
编辑:
澄清.用"new(...)"我的意思是"任何东西".我的问题是我无法得到这个工作的最基本版本:
interface MyInterface {
new () : MyInterface;
}
class test implements MyInterface {
constructor () { }
}
Run Code Online (Sandbox Code Playgroud)
这不是为我编译我得到"类'测试'声明接口'MyInterface'但没有实现它:类型'MyInterface'需要一个构造签名,但类型'test'在尝试编译它时缺少一个.
编辑:
因此,在研究了这一点后,给出了反馈意见.
interface MyInterface {
new () : MyInterface;
}
class test implements MyInterface {
constructor () => test { return this; }
}
Run Code Online (Sandbox Code Playgroud)
是无效的TypeScript,这不能解决问题.您无法定义构造函数的返回类型.它将返回"测试".下面的签名:class test {constructor(){}}似乎是"new()=> test"(通过将"代码"粘贴在在线编辑器中,将鼠标悬停在"class"上获得).这就是我们想要的和我认为的.
任何人都可以在实际编译时提供此类或类似的示例吗?
编辑(再次......):
所以我可能想出了为什么可以在接口中定义它但不能在TypeScript类中实现的想法.以下工作:
var MyClass = (function () {
function MyClass() { }
return …
Run Code Online (Sandbox Code Playgroud) 我通过让它调用多个函数来拆分我的类构造函数,如下所示:
class Wizard:
def __init__(self, argv):
self.parse_arguments(argv)
self.wave_wand() # declaration omitted
def parse_arguments(self, argv):
if self.has_correct_argument_count(argv):
self.name = argv[0]
self.magic_ability = argv[1]
else:
raise InvalidArgumentsException() # declaration omitted
# ... irrelevant functions omitted
Run Code Online (Sandbox Code Playgroud)
当我的口译员愉快地运行我的代码时,Pylint抱怨:
Instance attribute attribute_name defined outside __init__
粗略的Google搜索目前毫无结果.保持所有构造函数逻辑__init__
似乎没有组织,并且关闭Pylint警告似乎也是黑客攻击.
什么是/ Pythonic解决这个问题的方法?
我有一个有2个构造函数的类:
public class Lens
{
public Lens(string parameter1)
{
//blabla
}
public Lens(string parameter1, string parameter2)
{
// want to call constructor with 1 param here..
}
}
Run Code Online (Sandbox Code Playgroud)
我想从第二个调用第一个构造函数.这可能在C#中吗?
假设你有一个人类:
public class Person
{
public string Name { get; set;}
public IEnumerable<Role> Roles {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
我显然应该在构造函数中实例化角色.现在,我曾经使用像这样的List:
public Person()
{
Roles = new List<Role>();
}
Run Code Online (Sandbox Code Playgroud)
但我在System.Linq
命名空间中发现了这种静态方法
IEnumerable<T> Enumerable.Empty<T>();
Run Code Online (Sandbox Code Playgroud)
来自MSDN:
该
Empty(TResult)()
方法缓存一个空的序列TResult
.当它返回的对象被枚举时,它不会产生任何元素.在某些情况下,此方法对于将空序列传递给用户定义的方法非常有用
IEnumerable(T)
.它还可以用于为诸如的方法生成中性元素Union
.有关此用法的示例,请参阅示例部分
那么编写这样的构造函数会更好吗?你用它吗?为什么?如果没有,为什么不呢?
public Person()
{
Roles = Enumerable.Empty<Role>();
}
Run Code Online (Sandbox Code Playgroud) 反正有没有检测JavaScript对象是否是正则表达式?
例如,我想做这样的事情:
var t = /^foo(bar)?$/i;
alert(typeof t); //I want this to return "regexp"
Run Code Online (Sandbox Code Playgroud)
这可能吗?
谢谢!
编辑:谢谢你的所有答案.看来我有两个非常好的选择:
obj.constructor.name === "RegExp"
Run Code Online (Sandbox Code Playgroud)
要么
obj instanceof RegExp
Run Code Online (Sandbox Code Playgroud)
这两种方法的主要优点/缺点是什么?
再次感谢!
是否可以使用子类的构造函数的初始化列表来初始化在父类中声明为protected的数据成员?我无法让它发挥作用.我可以解决它,但如果我不必这样做会很好.
一些示例代码:
class Parent
{
protected:
std::string something;
};
class Child : public Parent
{
private:
Child() : something("Hello, World!")
{
}
};
Run Code Online (Sandbox Code Playgroud)
当我尝试这个时,编译器告诉我:"类'Child'没有任何名为'something'的字段".这样的事情可能吗?如果是这样,语法是什么?
非常感谢!
假设您有一个名为Customer的类,其中包含以下字段:
我们还要说,根据您的业务逻辑,所有Customer对象都必须定义这四个属性.
现在,我们可以通过强制构造函数指定每个属性来轻松地完成此操作.但是,当您被迫向Customer对象添加更多必需字段时,很容易看出它会如何失控.
我已经看到了在构造函数中加入20多个参数的类,使用它们只是一种痛苦.但是,或者,如果您不需要这些字段,则可能会遇到未定义信息的风险,或者更糟糕的是,如果您依赖调用代码来指定这些属性,则会引发对象引用错误.
有没有替代方案,或者你只需要决定X的构造函数参数是否太多,你不能忍受?
最近,我遇到了这种不寻常的(对我来说)Java语法...下面是一个示例:
List list = new <String, Long>ArrayList();
Run Code Online (Sandbox Code Playgroud)
请注意<String, Long>
类型参数的位置...它不是在普通类型之后,而是之前。我不介意承认我以前从未见过这种语法。另请注意,ArrayList
只有1个时有2个类型参数。
类型参数的位置是否与将其放在类型后面的含义相同?如果不是,不同的定位是什么意思?
为什么ArrayList
只有1 个类型有2个类型参数是合法的?
我搜寻了平常的地方,例如。Angelika Langer等人在这里,但是除了ANTLR项目的Java语法文件中的语法规则之外,找不到任何关于此语法的提及。
这可能是一个基本问题,可能已经被问过(比方说,这里); 但我还是不明白.所以,让我问一下.
考虑以下C++类:
class Obj{
char* str;
public:
Obj(char* s){
str = s;
cout << str;
}
~Obj(){
cout << "Done!\n";
delete str; // See the comment of "Loki Astari" below on why this line of code is bad practice
}
};
Run Code Online (Sandbox Code Playgroud)
以下代码片段之间的区别是什么:
Obj o1 ("Hi\n");
Run Code Online (Sandbox Code Playgroud)
和
Obj* o2 = new Obj("Hi\n");
Run Code Online (Sandbox Code Playgroud)
为什么前者调用析构函数,但后者不调用(没有显式调用delete
)?
哪一个更受欢迎?
constructor ×10
c# ×3
c++ ×2
inheritance ×2
coding-style ×1
destructor ×1
generics ×1
instanceof ×1
interface ×1
java ×1
javascript ×1
linq ×1
new-operator ×1
parameters ×1
pylint ×1
python ×1
refactoring ×1
regex ×1
syntax ×1
typeof ×1
typescript ×1