当我正在学习ASP.NET MVC时,我正在关注Nerd Dinner tutorial,我目前正在Step 3: Building the Model。本节的一部分讨论如何将验证和业务规则逻辑与模型类集成。这一切都非常有意义。但是,对于此源代码,作者仅验证一个类:Dinner。
我想知道的是,我有多个需要验证的课程(晚餐,来宾等)。在部分类中反复编写这两种方法对我来说似乎并不聪明:
public bool IsValid
{
get { return (GetRuleViolations().Count() == 0); }
}
partial void OnValidate(ChangeAction action)
{
if (!IsValid)
{
throw new ApplicationException("Rule violations prevent saving.");
}
}
我想知道的是,您是否可以创建一个抽象类(因为“GetRuleViolations”需要单独实现)并扩展分部类?我在想这样的事情(根据他的例子):
public partial class Dinner : Validation {
public IEnumerable<RuleViolation> GetRuleViolations() {
yield break;
}
}
这并没有“感觉”正确,但我想用SO来检查,以获得比我更聪明的人的意见。我也测试了它,似乎OnValidate方法上的partial关键字引起了问题(可以理解)。这似乎无法解决(但我很可能是错的)。
谢谢!
答案 0 :(得分:3)
我想知道的是,你能创造一个 抽象类......并扩展一个 偏班?
当然,partial
关键字只是表明该类是在多个文件中实现的 - 它与继承无关...... 除了一个狭隘的方面:
如果部分类包含a 引用前向声明的 部分方法,但没有一部分 class实现了部分方法 - 对该部分方法的所有调用都将 编译器省略。
那是什么意思呢。如果你的部分类在其中一个部分中声明了一个部分方法,但是你的类的其他部分没有定义部分方法 - 那么你就不能在任何派生类中调用那个部分方法......因为它不存在。
让我们看一个例子:
// file1.cs (code gen'd)
public partial class Validation {
partial void OnValidate(ChangeAction action);
private void SomeMethod() {
OnValidate( ChangeAction.Whatever );
}
}
// file2.cs (Validation class body)
public partial class Validation {
//partial void OnValidate(ChangeAction action) { ... }
}
public class Dinner : Validation {
public void SomeOtherMethod() {
OnValidate(null); // won't compile ... OnValidate doesn't exist
}
}
您还应该知道,部分方法不能包含修饰符(如new,abstract,virtual,public,private等)。这意味着您不能覆盖派生类中的部分方法。但是,您可以定义部分方法调用的虚方法。
对于您的一般问题,从部分类继承或尝试避免重复代码没有任何问题。但是,您需要在部分类/方法强加的一两个限制内工作。
在您的示例中,如果要避免重复逻辑,可能需要在基类中定义部分方法以确保它们始终可用。派生类将无法覆盖它们 - 但如果需要,则不要使这些方法成为局部。