我希望有一个重载的构造函数,我根据是否设置了“isFirstPost”来更改基类的值。如果它是第一篇文章,我想要rowkey = 000000.如果它不是第一篇文章,那就把它作为一个数字。
不要将此视为Azure问题......但我对C#语言更感兴趣,并使条件参数影响基类的设置。我不知道该怎么做。
public class ForumPost : TableServiceEntity
{
public ForumPost(string partitionKey, string rowKey): base(partitionKey, rowKey)
{
}
public ForumPost(ForumThread ParentThread, bool IsFirstPost)
{
if (IsFirstPost)
{
//call constuctor with special values for base class
//set baseclass rowkey = 0000000
}
else {
//set baseclass rowkey = 1111111111
}
}
}
答案 0 :(得分:5)
这是不可能的,因为必须在当前类的构造函数之前调用基础构造函数。你可以做的是定义一个静态函数,它将正确的id传递给基础构造函数。
public class ForumPost : TableServiceEntity
{
public ForumPost(ForumThread ParentThread, bool IsFirstPost)
: base(ParentThread, GetID(IsFirstPost))
{
}
static string GetID(bool IsFirstPost)
{
return IsFirstPost ? "00000" : "11111";
}
}
答案 1 :(得分:2)
这样做:
public class ForumPost : TableServiceEntity {
public ForumPost(ForumThread ParentThread, bool IsFirstPost)
: base("partitionkey", IsFirstPost ? "0000000" : "1111111") {
}
}
注意:我不知道你想要传递的是什么partition key。
更新:要了解此构造可以采取的措施,我们可以查看C# specification。
在C# grammar中,我们找到了以下条目:
构造-初始化:
:base(argument-list opt )
:this(argument-list opt )
参数列表:
参数
参数列表,参数
参数:
表达
ref变量引用
变量引用
反过来,这会扩展到语言支持的各种表达式(请参阅C.2.4部分)。这包括方法调用,数学表达式,三元条件运算符等等。
在规范的第10.11.1节(构造函数初始值设定项)中,我们发现:
实例构造函数声明的formal-parameter-list给出的参数范围包括该声明的构造函数初始值设定项。因此,允许构造函数初始值设定项访问构造函数的参数。 [...]实例构造函数初始值设定项无法访问正在创建的实例。因此,在构造函数初始值设定项的参数表达式中引用它是一个编译时错误,因为参数表达式通过简单名称引用任何实例成员的编译时错误。
因此,您可以像处理任何方法一样对待它。您可以访问构造函数的参数,但不能访问正在创建的实例。这意味着,如果您的逻辑涉及正在构造的实例的任何实例成员,您将不得不重新设计您的类以将它们分开
我认为我给出的答案(使用条件运算符)对于您的示例来说是最直接的。我们也可以把它带到另一个极端,并使用工厂方法来获得该逻辑的策略:
public class ForumPost : TableServiceEntity {
public ForumPost(ForumThread ParentThread, bool IsFirstPost)
: base("partitionkey",
RowKeyStrategyFactory.Create().ResolveRowKey(IsFirstPost)) {
}
}
在这里,您可以看到一个静态工厂方法调用,它返回一个策略实例,然后对运行所需逻辑的策略虚拟方法进行实例调用。具体的策略类将基于例如配置来决定,并且将包含在给定其参数的情况下生成右行键的逻辑。
正如您所看到的,这个问题没有单一的答案,只有您可以根据您的设计和约束来决定。但是通过了解构造可以处理的内容,您可以更好地做出正确的决定。