代码之家  ›  专栏  ›  技术社区  ›  JasCav

类结构w/LINQ、部分类和抽象类

  •  0
  • JasCav  · 技术社区  · 15 年前

    我在跟踪 Nerd Dinner tutorial 因为我正在学习ASP.NETMVC,而且我现在 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 回复  |  直到 15 年前
        1
  •  3
  •   LBushkin    15 年前

    我想知道的是,你能创造一个 抽象类。。。延伸 部分课程?

    当然,是那个 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
        }
    }
    

    在您的示例中,如果希望避免重复逻辑,则可能需要在基类中定义分部方法,以确保它们始终可用。派生类将无法重写它们—但如果需要,则不要将这些方法部分化。