具有LINQ,部分类和抽象类的类结构

时间:2010-05-17 18:07:15

标签: c# asp.net asp.net-mvc

当我正在学习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关键字引起了问题(可以理解)。这似乎无法解决(但我很可能是错的)。

谢谢!

1 个答案:

答案 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等)。这意味着您不能覆盖派生类中的部分方法。但是,您可以定义部分方法调用的虚方法。

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

在您的示例中,如果要避免重复逻辑,可能需要在基类中定义部分方法以确保它们始终可用。派生类将无法覆盖它们 - 但如果需要,则不要使这些方法成为局部。