是否有更好的方法来执行以下操作...
我有一个基类,它提供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
。有什么方法可以避免这种情况吗?
答案 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 {} ...}