我知道这应该是一个非常简单的问题,但我一直在努力解决这个概念.我的问题是,你如何在c#中链接构造函数?我是第一个OOP课程,所以我只是在学习.我不明白构造函数链如何工作或如何实现它,甚至为什么它不仅仅是没有链接的构造函数.
我会很感激一些解释的例子.
那么如何将它们联系起来呢?我知道有两个:
public SomeClass this: {0}
public SomeClass
{
someVariable = 0
}
Run Code Online (Sandbox Code Playgroud)
但你如何用三,四等做到这一点?
再一次,我知道这是一个初学者的问题,但我很难理解这一点,我不知道为什么.
在C#中,当你这样做时
Class(Type param1, Type param2) : base(param1)
Run Code Online (Sandbox Code Playgroud)
是先执行的类的构造函数,然后调用超类构造函数还是先调用基础构造函数?
在this关键字是冒号之前.任何人都可以解释结肠在这种情况下的含义吗?我不相信这是一种安慰.
谢谢
using System;
namespace LinkedListLibrary
{
class ListNode
{
private object data;
private ListNode next;
public ListNode(object dataValue)
: this(dataValue, null)
{
}
public ListNode(object dataValue, ListNode nextNode)
{
data = dataValue;
next = nextNode;
}
public ListNode Next
{
get
{
return next;
}
set
{
next = value;
}
}
public object Data
{
get
{
return data;
}
}
}
}
Run Code Online (Sandbox Code Playgroud) 在Java中,有没有办法在超级构造函数运行之前初始化字段?
即使是我能想到的最丑陋的黑客也会被编译器拒绝:
class Base
{
Base(String someParameter)
{
System.out.println(this);
}
}
class Derived extends Base
{
private final int a;
Derived(String someParameter)
{
super(hack(someParameter, a = getValueFromDataBase()));
}
private static String hack(String returnValue, int ignored)
{
return returnValue;
}
public String toString()
{
return "a has value " + a;
}
}
Run Code Online (Sandbox Code Playgroud)
注意:当我从继承切换到委托时,问题就消失了,但我仍然想知道.
java inheritance constructor initialization constructor-chaining
我希望了解
当应用于对象构造函数时.每次我随机添加关键字直到编译器关闭 - 并且(在使用Delphi开发12年之后)我宁愿知道我在做什么,而不是随意尝试.
给出一组假设的对象:
TComputer = class(TObject)
public
constructor Create(Cup: Integer); virtual;
end;
TCellPhone = class(TComputer)
public
constructor Create(Cup: Integer; Teapot: string); virtual;
end;
TiPhone = class(TCellPhone)
public
constructor Create(Cup: Integer); override;
constructor Create(Cup: Integer; Teapot: string); override;
end;
Run Code Online (Sandbox Code Playgroud)
我希望它们表现的方式可能从声明中可以明显看出,但是:
TComputer 有简单的构造函数,后代可以覆盖它TCellPhone 有一个替代构造函数,后代可以覆盖它TiPhone 覆盖两个构造函数,调用每个构造函数的继承版本现在该代码无法编译.我想明白为什么它不起作用.我也想了解覆盖构造函数的正确方法.或许你永远不能覆盖构造函数?或者覆盖构造函数是完全可以接受的?也许你永远不应该有多个构造函数,也许完全可以接受多个构造函数.
我想了解原因.修复它会很明显.
编辑:我也期待获得的订单上的推理virtual,override,overload,reintroduce.因为在尝试关键字的所有组合时,组合的数量会爆炸:
我对构造函数链的理解是,当一个类中有多个构造函数(重载的构造函数)时,如果其中一个构造函数试图调用另一个构造函数,那么这个过程称为CONSTRUCTOR CHAINING,这在C++中是不受支持的.最近我在阅读在线资料时遇到了这一段......就像这样......
您可能会发现自己处于要编写成员函数以将类重新初始化为默认值的情况.因为您可能已经有一个构造函数来执行此操作,您可能会尝试从您的成员函数中调用构造函数.如前所述,链接构造函数调用在C++中是非法的.您可以从函数中的构造函数中复制代码,这将起作用,但会导致重复的代码.在这种情况下,最好的解决方案是将代码从构造函数移动到新函数,并让构造函数调用您的函数来完成初始化数据的工作.
调用构造函数的成员函数是否也在构造函数链接下?请在C++中详细介绍这个主题.
我时不时地碰到我以前见过的语法,但从未使用过.这是其中一次.
有人可以按照C#构造函数方法解释":this"或":base"的用途吗?
例如:
public MyClass(SomeArg arg) : this(new SomethingElse(), arg)
{
}
Run Code Online (Sandbox Code Playgroud)
我的直觉是它用于将默认参数映射到另一个构造函数方法.
更新:用一个更简单的例子来解决问题,原来接受的答案没有回答
鉴于以下类及其祖先:
TComputer = class(TObject)
public
constructor Create(Teapot: string='');
end;
TCellPhone = class(TComputer)
public
constructor Create(Cup: Integer); overload; virtual;
constructor Create(Cup: Integer; Teapot: string); overload; virtual;
end;
Run Code Online (Sandbox Code Playgroud)
现在TCellPhone有3个构造函数可见:
我该怎么做才能TCellPhone使祖先构造函数(Teapot: string = '')不可见,只留下声明的构造函数:
注:通常简单的行为有一个后代的构造函数隐藏了祖先:
Run Code Online (Sandbox Code Playgroud)TCellPhone = class(TComputer) public constructor Create(Cup: Integer); virtual; end;
- 杯子:整数
如果你想保留祖先构造函数和后代,你可以将后代标记为
overload:Run Code Online (Sandbox Code Playgroud)TCellPhone = class(TComputer) public constructor Create(Cup: Integer); overload; virtual; end;
- 杯子:整数
- 茶壶:string =''
在这个问题的示例代码中,Delphi误解了我的 …
我试图更好地理解一般实践...特别是在构造函数中派生this().我知道它的代码较少,但我认为它的可读性较差.这样做是常见/好的做法吗?或者编写第二个专门处理它的构造函数是否更好?
public SomeOtherStuff(string rabble) : this(rabble, "bloop") { }
Run Code Online (Sandbox Code Playgroud)
要么
Public SomeOtherStuff(string rabble)
{
//set bloop
}
Run Code Online (Sandbox Code Playgroud)
任何投入将不胜感激
我正在做一些测试,偶然发现了以下情况:
您可以根据需要重载PoShv5中的方法.如果调用不带参数的方法,它可以在内部使用参数调用方法,以保持代码不冗余.我预计这对于构造函数也是如此.
在此示例中,最后一个构造函数按预期工作.其他构造函数仅返回没有设置值的对象.
Class car {
[string]$make
[string]$model
[int]$Speed
[int]$Year
speedUp (){
$this.speedUp(5)
}
speedUp ([int]$velocity){
$this.speed += $velocity
}
# Constructor
car () {
[car]::new('mall', $Null, $null)
}
car ([string]$make, [string]$model) {
[car]::new($make, $model, 2017)
}
car ([string]$make, [string]$model, [int]$Year) {
$this.make = $make
$this.model = $model
$this.Year = $year
}
}
[car]::new() # returns "empty" car
[car]::new('Make', 'Nice model') # returns also an "empty" one
[car]::new( 'make', 'nice model', 2017) # returns a "filled" instance
Run Code Online (Sandbox Code Playgroud)
有没有办法来解决这个问题?我错过了什么?
powershell constructor overloading class constructor-chaining
constructor ×10
c# ×5
delphi ×2
delphi-5 ×2
inheritance ×2
overloading ×2
.net ×1
c++ ×1
class ×1
java ×1
powershell ×1