不继承属性是没有意义的。
重写时删除[Required]
属性本质上违反了LSP。
如果NotRequiredDerived
是 的子类型RequiredBase
,则类型对象RequiredBase
可以替换为类型对象NotRequiredDerived
(即类型对象RequiredBase
可以替换为子类型的任何对象NotRequiredDerived
),而不会改变程序的任何所需属性。
把它放在简单的代码中:
var requiredPhoneNumber = new RequiredBase() { PhoneNumber = "123456789" };
HandleRequiredBaseObject(requiredPhoneNumber); //Works
var optionalPhoneNumber = new NotRequiredDerived() { PhoneNumber = null };
HandleRequiredBaseObject(optionalPhoneNumber); //Fails
HandleRequiredBaseObject(RequiredBase obj)
固有地假设PhoneNumber
是必需的(根据RequiredBase
类的定义);并且不期望收到缺少此约束的派生对象!这将导致运行时异常。
不违反 LSP 的唯一方法是确保[Required]
在派生类上不违反约束;这意味着首先尝试删除[Required]
注释是没有意义的。
我可以想到一个不继承属性有意义的理论案例:如果属性扩展了有效选项的范围,而不是限制它。
假设我们创建一个类PositiveNumber
和一个属性,将其设置为也允许负数:
public class Base
{
[NegativesAllowed]
public PositiveNumber Number { get; set; }
}
public class Derived : Base
{
public PositiveNumber Number { get; set; }
}
如果Base
允许所有数字,并且Derived
只允许正数,那么它本质上并不违反 LSP。
然而,这似乎是一个非常强迫的情况。使用一个有限的类型,然后通过一个属性来扩展,这不是你实际会遇到的事情。
对于您的情况,您根本不应该从另一个视图模型继承一个视图模型。
需要不同属性的事实是您不应该继承这些类的主要原因!他们应该以不同的方式工作,因此不应该假装一个是另一个的派生。