2010-05-17 31 views
0

我跟随Nerd Dinner tutorial,因为我在学习ASP.NET MVC,而我目前在Step 3: Building the Model上。本节的一部分讨论如何将验证和业务规则逻辑与模型类集成。这一切都很合理。但是,在这个源代码的情况下,作者只验证一个类:晚餐。具有LINQ,部分类和抽象类的类结构

我想知道的是,说我有多个类需要验证(晚餐,客人等)。它似乎并不聪明,我多次在局部类这两种方法写:

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关键字导致了问题(可以理解)。这似乎不可能解决(但我很可能是错的)。

谢谢!

+2

不是一个真正的直接回答你的问题,所以我会张贴它作为一个评论:如果你使用MVC 2,有数据注释来验证使用方式更简单的模型。见http://weblogs.asp.net/scottgu/archive/2010/01/15/asp-net-mvc-2-model-validation.aspx – 2010-05-17 18:16:01

+0

目前还不清楚你使用部分方法遇到了什么问题 - 如果你提供更多信息,有可能为您的问题提供更清晰的答案。 – LBushkin 2010-05-17 18:30:14

+0

@Julien - 非常棒!谢谢。我知道这并没有回答我原来的问题,但这是我最终的结果。谢谢! – JasCav 2010-05-17 20:35:56

回答

3

我在想,是否可以创建一个 抽象类...并扩展一个 部分类?

肯定的是,partial关键字只是表明类在多个文件中实现 - 它继承没有真正的轴承... 除了在一个狭窄的方面

若偏类包含对前向声明的 部分方法的引用 ,但该类的任何部分都不实现该部分方法 - 编译器会忽略对该部分方法的所有调用 。

那么这是什么意思。如果您的部分类在其中一个部分中声明了部分方法,但是您的类的其他部分没有定义部分方法 - 那么您无法在任何派生类中调用该部分方法...因为它不会存在。

让我们来看一个例子:

// 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 
    } 
} 

你也应该知道,分部方法不能有修饰符(如新的,抽象的,虚拟的,公共的,私人的,等等)。这意味着您无法重写派生类中的部分方法。但是,您可以定义部分方法调用的虚拟方法。

对于您的一般问题,从部分类继承或尝试避免重复代码没有任何问题。但是,您需要在部分类/方法强加的一个或两个限制内工作。

在你的例子中,如果你想避免重复逻辑,你可能需要在基类中定义你的部分方法,以确保它们始终可用。派生类不能覆盖它们 - 但如果需要这样做,那么就不要使这些方法部分化。

+0

谢谢你这样写得很好的答案。来自Java世界,我还没有习惯这些概念,所以我很欣赏澄清和附加信息。谢谢! – JasCav 2010-05-17 20:36:50