我正在基于TextBox在C#中编写自定义控件.我希望我的控件的Text属性是只读的(因为在文本框中只允许某些值,我不希望调用程序能够在其中放置无效值.)
我不知道该怎么做.如果我使用公共覆盖Text {},编译器会插入默认的get和set访问器.如果我注释掉set访问器,则代码编译并运行,我假设这意味着正在使用基本访问器.如果我将readonly放在我的属性的定义中,编译器会抛出一个错误.
任何帮助将不胜感激.
这里的问题是,通过尝试将读/写属性设置为只读,您违反了基类的合同.您的基类明确声明可以检索和修改此属性.派生类不能破坏其基类的契约,否则多态会失败.请记住,如果B派生自A,则在接受A对象的任何地方,B必须执行.
如果派生类不应该这样,那么我首先会质疑设计 - 这应该真的来自基类吗?这真的是一种"是一种"关系吗?
假设我们通过了那个测试而且确实应该派生出来,一种方法 - 我个人不喜欢,但无论如何也会分享 - 可能只是让setter抛出异常.我个人不喜欢这样,它仍然违反了合同,并且在使用派生类时感觉过度认知摩擦,但如果你真的有这样的理由那么这样做......好吧......好吧,我猜.但是你要确定你知道为什么你正在乱砍这个.
但回到第一点:从设计的角度来看,这真的是派生类是正确答案的场景吗?没有看到你的代码,我的直觉反应是否定的.
不知何故,在我最初的阅读中,我错过了我们在这里讨论UI控件的事实.我支持我在上面编辑的内容,在一般属性覆盖案例中.但是,在UI控件的情况下,多态性机会(我希望)会有所限制,并且需要可能证明这个设计是合理的,那么我的建议是让Text属性设置器抛出异常.
在我看来,更好的设计是构图.创建用户控件,使用Dock = Fill将TextBox添加到用户控件设计图面,然后公开一个只读的新Text属性.您现在也可以只公开您真正想要的属性.