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

分部类/分部方法与基/继承类

  •  3
  • mare  · 技术社区  · 15 年前

    关于课堂设计的问题。目前我有以下结构:

    抽象基本存储库类

    默认存储库实现类(实现一些抽象方法,其中逻辑在所有特定类中都是通用的,但其他类则为空)

    特定的存储库实现类(实现上述默认类中留空的内容)

    我现在遇到的问题是,在特定的类中有一个特定的update()方法,但是当这个方法中的所有代码执行时,也应该执行一些来自基本默认类的代码。

    我可以这样做

    public override Update()
    {
        // do Specific class actions and updates
        // ....
    
        // follow with base.Update()
        base.Update();
    }
    

    但这需要在所有继承的方法中调用那些base.xyz()。我可以不知道怎么用分词来解释吗?

    因此,要求在父类和继承类中都有代码(或者使用部分使这两个类成为一个类),并且应该在这两个地方执行方法实现中的代码。如果我想把它转过来,先执行基类代码,然后执行继承的类代码,那又该怎么办呢?

    谢谢

    5 回复  |  直到 15 年前
        1
  •  8
  •   Klaus Byskov Pedersen    15 年前

    你是否考虑过:

    public abstract class YourBaseClass
    {
        public void Update()
        {
            // Do some stuff
            //
    
            // Invoke inherited class's  method
            UpdateCore();
        }
    
        protected abstract void UpdateCore();
    }
    
    public class YourChildClass : YourBaseClass
    {
         protected override void UpdateCore()
         {
             //Do the important stuff
         }
    }
    
    
    //Somewhere else in code:
    var ycc = new YourChildClass();
    ycc.Update();
    
        2
  •  3
  •   ChrisF    15 年前

    所有的 partial 关键字表示类的定义在源文件之间拆分:

    可以将类或结构、接口或方法的定义拆分为两个或多个源文件。每个源文件都包含类型或方法定义的一部分,并且在编译应用程序时合并所有部分。

    项目中还必须有一个完整的类定义。

    最好创建一个子类,这样可以覆盖特定的方法。

    就部分方法而言(与上面的链接相同):

    分部方法声明由两部分组成:定义和实现。这些可以是部分类的单独部分,也可以是同一部分。如果没有实现声明,那么编译器会同时优化定义声明和对方法的所有调用。

    // Definition in file1.cs
    partial void onNameChanged();
    
    // Implementation in file2.cs
    partial void onNameChanged()
    {
      // method body
    }
    

    在一个文件中不能有一半方法,在另一个文件中不能有另一半方法。

        3
  •  2
  •   Anton Gogolev    15 年前

    你可以这样做:

    public sealed override void Update()
    {
        UpdateCore();
        base.Update();
    }
    
    public abstract /* or virtual */ void UpdateCore()
    {
        // Class-specific stuff
    }
    
        4
  •  1
  •   Hans Passant    15 年前

    忘记部分,它有完全不同的语义。虚拟基类方法的重写器是否应调用基类方法不是自动的。它必须是文档的一部分。控制类中的onXXXX()方法就是一个很好的例子,msdn库文档有一个“要实现的注释”注释,警告调用基类方法通常是必要的。

    如果将基类方法抽象化,则重写器就可以清楚地看到它。如果不是的话,你在强烈暗示应该这样做。如果您希望重写完全替换您的基本实现,那么您真的应该考虑将其抽象化。这种模糊性,加上重写器错误地重写而破坏基类的可能性,无疑是多态性的弱点之一。

        5
  •  0
  •   Andras Zoltan    15 年前

    添加新的虚拟(不是抽象的,因为不是所有特定的实现都需要重写它?)方法设置为默认实现,以适应继承者在其自身实现的基础上拥有自己的附加步骤。

    在默认实现的抽象方法实现的适当点调用虚拟方法。

    您已经离开了抽象类,并且透明地增加了默认实现的灵活性。