派生类中不需要的虚拟字符串属性的setter

时间:2016-12-08 21:04:28

标签: c#

是否有更好的方法来执行以下操作...

我有一个基类,它提供String属性的默认实现。显然可选择设置,不是必需的。

编辑:我无法使用接口而不是此基类,因为我在其中有行为,在此示例中已将其删除。

DisplayName

我有一个系统对象类,派生自public abstract class BaseObject { public virtual string DisplayName { get; protected set; } public BaseObject(string displayName) { if (!string.IsNullOrWhiteSpace(displayName)) { this.DisplayName = displayName.Trim(); } } // There is common behavior, unrelated to DisplayName here ... trimmed out of this sample code. } ,但提供了自己的BaseObject实现

DisplayName

我有一个用户定义的对象,派生自相同的基类:

public class SystemObject : BaseObject
{
    public override string DisplayName
    {
        get
        {
            return string.Format("TODO: Resources.{0}", this.Id);
        }
        // EDIT: Turns out I can't even do that, because EF can't materialize the property. So, it needs to be an empty protected setter.
        protected set { throw new InvalidOperationException("Do not set this property!"); }
    }

    public SystemObject() : base(null)
    {
    }
}

利用public class UserObject : BaseObject { public UserObject(string displayName) : base(displayName) { if (string.IsNullOrWhiteSpace(displayName)) { throw new ArgumentNullException("displayName"); } } public void ChangeDisplayName(string newDisplayName) { if (string.IsNullOrWhiteSpace(newDisplayName)) { throw new ArgumentNullException("newDisplayName"); } this.DisplayName = newDisplayName.Trim(); } } 中的DisplayName来存储用户提供的显示名称。

我无法在BaseObject摘要中制作DisplayName,因为我先做EF代码。

我特别关注BasObject。有什么方法可以避免这种情况吗?

3 个答案:

答案 0 :(得分:1)

当您实际上不想定义任何行为时,根本不要使用抽象类。如果你只是想要一种方法来说明存在具有DisplayName属性getter的不同对象,那么创建一个接口来定义这两个类可以以自己的方式实现的契约。

答案 1 :(得分:0)

我想我知道你要去哪里。

独自离开酒店。只需将它作为基类中的get-only属性,但将getter调用为抽象方法:

public string DisplayName { get { return GetDisplayName(); } }

然后将该方法声明为抽象:

protected abstract string GetDisplayName();

这将强制您的继承类提供如何返回显示名称的实现。然后,您可以更改UserObject类以在实例化期间在内部存储名称,并在方法的实现中将其返回。

答案 2 :(得分:0)

你可以简单地将其删除,什么都不做;

public string DisplayName { set {} ...}