Ged*_*dde 6 .net c# inheritance overriding properties
我很难在C#中实现一个只在抽象基类中有一个getter的属性,但是我需要在其中一个派生类中引入一个setter.
我的类图概述如下:

我的目标是两个类TextElementStatic和TextElementReferenceSource应该具有包含getter和setter 的Text属性,而类TextElementReferenceTarget应该具有仅具有getter 的Text属性.我在引用所有这些对象时经常使用ITextElement,我需要确保ITextElement接口只有一个getter.此外,基类TextElement实现了许多通用代码,因此所有类都需要从该类继承.
我当前的代码如下所示:
接口:ITextElement
public interface ITextElement
{
string Text { get; }
}
Run Code Online (Sandbox Code Playgroud)
接口:ITextElementUpdatable
public interface ITextElementUpdatable : ITextElement
{
new string Text { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
抽象类:TextElement (这是我的问题所在,解释如下)
public abstract class TextElement : ITextElement
{
// I want to mark this 'abstract', but that causes my problem
public virtual string Text
{
get
{
// NOTE: This should never be called
Debug.Fail("Called virtual Text getter that should never be called");
return default(string);
}
}
}
Run Code Online (Sandbox Code Playgroud)
抽象类:TextElementUpdatable
public abstract class TextElementUpdatable : TextElement, ITextElementUpdatable
{
// Should have both a getter and a setter
public new virtual string Text { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
类:TextElementStatic
public class TextElementStatic : TextElementUpdatable
{
// Should have both a getter and a setter
// No Text property declaration
// Inherits Text property from TextElementUpdatable
}
Run Code Online (Sandbox Code Playgroud)
类:TextElementReferenceSource
public class TextElementReferenceSource : TextElementUpdatable
{
// Should have both a getter and a setter
public override string Text
{
get { return _internalobject.Text; }
set { _internalobject.Text = value; }
}
}
Run Code Online (Sandbox Code Playgroud)
类:TextElementReferenceTarget
public class TextElementReferenceTarget : TextElement
{
// Should ONLY have a getter
public override string Text
{
get { return _internalobject.Text; }
}
}
Run Code Online (Sandbox Code Playgroud)
所以,我的问题是:我真的想在基类TextElement抽象中声明Text属性,因为它应该总是在派生类中实现(TextElementUpdatable,TextElementReferenceSource和TextElementReferenceTarget都实现了这个属性).但是,如果我尝试将属性转换为public abstract string Text { get; },则会在TextElementUpdatable中收到指定该错误的错误
TextElementUpdatable.Text hides the inherited property TextElement.Text
Run Code Online (Sandbox Code Playgroud)
此外,如果我的属性更改TextElementUpdatable从new到override该错误消息改为:
Cannot override because TextElement.Text does not have an overridable set accessor
Run Code Online (Sandbox Code Playgroud)
现在,我可以回到TextElement并将属性更改为public virtual string Text { get; private set; }并调用它一天,因为无论如何都不应该调用该方法(这基本上是我现在的解决方案).但是,如果我或某人稍后创建了另一个派生类,我想强迫我/他们实现Text-property,因此我宁愿将其标记为抽象而不是提供虚拟实现.
关于如何以正确的方式做到这一点的任何建议 - 即使它应该涉及大量的重构?
我知道我可以将她的两个目标分开,只提供一个继承的Text属性,只有一个getter,然后SetText()在ITextElementUpdatable接口中引入一个方法.但是,我想知道是否有可能找到一个只有属性的好解决方案.
另一个类似的问题,但没有任何答案,我已经能够使用:C# - 当每个继承的类需要从基类获取getter时我该怎么办,但是setter只能用于一个继承的类
小智 0
在层次结构中使用具有不同含义的相同属性可能会有点令人困惑。也许 ITextElement.get_Text 和 ITextElementUpdatable.get_Text 的实现稍后会有所不同 - 接口定义了两个独立的行为,并且我们并不总是使用基本类型,例如字符串。所以我的建议是,您应该在 ITextElement 中拥有一个用于只读目的的属性,并在 ITextElementUpdatable 中拥有另一个具有不同名称的属性。通过这种方式,您的方法当然可以被定义为抽象的。
| 归档时间: |
|
| 查看次数: |
641 次 |
| 最近记录: |