简短:编写基类属性,我们更喜欢显式set
方法还是覆盖get
方法?
我的Pages有一个基类。它实现了几个“功能”;某些实例可能想要禁用该功能,这在设计时是已知的(即它不会改变)。基类如下所示:
public class MyPage : System.Web.UI.Page
{
void Method()
{
if (Feature1)
DoSomething1();
}
}
问题是:首选以下两种定义Feature1
属性的方法中的哪一种:
// In MyPage class
private bool _feature1 = true;
protected bool Feature1
{
get { return _feature1; }
set { _feature1 = value; }
}
// In Derived page class, somewhere early
Feature1 = false;
与
// In MyPage class
protected virtual bool Feature1
{
get { return true; }
}
// In Derived page class
protected override bool Feature1
{
get { return false; }
}
在第一种情况下,该属性对派生的Page调用具有明确的set
;在第二种情况下,该属性没有set
,而是允许派生的页面覆盖get
。我们有偏好吗?
这个选择适用于更常见的C#案例,而不是我的Pages,但它表明我在某些方面受到限制(例如我不做new
,我不负责构造函数,。 ..)
答案 0 :(得分:1)
根据您的描述,它肯定声音就像您打算成为一个只读字段。
在这种情况下,仅定义属性的get
一半,并在派生类中重写它是合适的。
如果有人试图设置编译时错误而不是运行时错误,这也有好处。
当然,如果它的不是应该是只读的,那么你需要实现setter。
答案 1 :(得分:0)
使用auto属性并在构造函数中设置值。
protected bool Feature1 { get; set; }
// Your Constructor
public YourClassName(bool featureState)
{
Feature1 = featureState;
}
答案 2 :(得分:0)
最好覆盖set
。由于它在派生类中没有任何功能,你或其他人可能想要设置在这种情况下无效的值,然后在几天或几周后你想知道为什么它设置Feature1
不能按预期工作。所以如果有人试图设置它,你最好抛出异常:
override bool Feature1
{
get { return true; }
set { throw new InvalidOperationException("In this implementation 'Feature1' is read-only."); }
}
示例:
class Program
{
static void Main(string[] args)
{
bool baseFeature1a = new Base1().Feature1; // false
bool baseFeature1b = (new Derived1() as Base1).Feature1; // true
bool baseFeature2a = new Base1().Feature2; // false
bool baseFeature2b = (new Derived1() as Base1).Feature2; // true
}
}
class Base1
{
private bool feature2 = false;
public virtual bool Feature1
{
get { return false; }
}
public virtual bool Feature2
{
get { return feature2; }
protected set { feature2 = value; }
}
}
class Derived1 : Base1
{
public Derived1()
{
Feature2 = true;
}
public override bool Feature1
{
get { return true; }
}
}