是否有可能通过覆盖它的访问添加到.NET的属性?
-
23-08-2019 - |
题
是否有可能做这样的事情?
class A
{
public virtual string prop
{
get
{
return "A";
}
}
}
class B: A
{
private string X;
public override string prop
{
get
{
return X;
}
set
{
X = value;
}
}
}
也就是说,基类提供的虚拟属性仅具有GET存取,但子类覆盖GET和还提供一组。
在当前的例子不能编译,但也许我失去了一些东西。
补充:为了澄清,没有我不希望有新的重新定义。我想添加一个新的访问。我知道这是不是在基类,所以它不能被重写。 OK,让我试着解释它是如何看没有语法糖:
class A
{
public virtual string get_prop()
{
return "A";
}
}
class B: A
{
private string X;
public override string get_prop()
{
return X;
}
public virtual string set_prop()
{
X = value;
}
}
解决方案
没有,这是不可能的。不幸的是,你甚至不能覆盖和更改访问级别(从保护的到的公共的为例),如记录上的 MSDN 。我建议你考虑略微重组代码/类,并寻找一个替代方式来完成这项任务,如与的保护的修改在派生类中使用SetProperty方法。宣称set访问p>
其他提示
没有,有没有办法做到这一点。考虑如何虚拟财产的语法糖已经被处理,即,它被转换为:
public virtual string get_prop();
没有set_Prop方法重写,并且不能覆盖不存在的方法。
您可以通过隐藏在派生类中使用new关键字基类的实现。以下应成功地进行编译:
class A
{
public virtual string prop
{
get
{
return "A";
}
}
}
class B : A
{
private string X;
public new string prop
{
get
{
return X;
}
set
{
X = value;
}
}
}
引入一个新的领域之嫌的凌乱。而无论哪种方式,你必须要小心,不要打破多态性和继承(如果基类会谈私有字段?)。
关于加边重写一个新的存取器;简单的答案是“不,你不能”。当你重写,只能冲击现有的存取,因为这是在虚拟表的部件(重写的成员仍是“拥有”由基/声明类,而不是覆盖类)来定义。
一个选项(不理想),是重新申报财产,但你仍然需要一个办法谈下来的基类。所以,如果在基类访问器是protected
:
class A
{
public string prop
{
get;
protected set;
}
}
class B : A
{
public new string prop
{
get { return base.prop; }
set { base.prop = value; }
}
}
不隶属于 StackOverflow