【问题标题】:How to have Different Partial classes use a Base Class to override same partial Method?如何让不同的部分类使用基类来覆盖相同的部分方法?
【发布时间】:2020-10-05 09:15:07
【问题描述】:

经过研究和this answer by Mr. Skeet 我认为这是不可能的,我只是想与社区再次确认是否遗漏了什么,或者我是否可以简化冗余的部分方法覆盖,这些覆盖看起来与我的生成的部分类完全相同.以下是我所拥有的以及我想要完成的:

我有许多生成部分类和方法。每个生成的分部类都有相同的分部方法ProccessResponse,例如:

// Generated partial classes/methods
public partial class Item1 {

    partial void ProcessResponse();

    public DoThing1(){
        //some generated business logic stuff
        ProcessResponse();
        //some more generated business logic stuff
   }
}

public partial class Item2 {

    partial void ProcessResponse();

    public DoThing2(){
        //some generated business logic stuff
        ProcessResponse();
        //some more generated business logic stuff
    }
}

我想重写 ProcessResponse() 的逻辑,使其对所有上述部分类都相同...在执行时执行一些日志记录。

我试图通过不为每个单独的部分类定义相同的部分方法来减少所有部分类中的业务逻辑冗余,例如:

// Non generated overriding partial classes/methods
public partial class Item1 : BaseClass { }

public partial class Item2 : BaseClass { }

public BaseClass {
    partial void ProcessResponse(){
        // Do The Same thing (logging....) for each partial class/method....
    }
}

这不起作用,上面BaseClass 中的部分方法不被识别为部分类中的相同部分方法......有什么想法或建议来完成这个吗?谢谢。

【问题讨论】:

    标签: c# asp.net-core base-class partial-classes


    【解决方案1】:

    更新

    好的,根据您的描述,我认为您的想法是创建一个Builder Design Pattern

    你可以使用接口和类的组合来实现,这里根据你给出的案例做一个扩展:

      public interface IBase
        {
            void DoThing1();
            void DoThing2();
            Item GetItem();
        }
    
        public class MyTestClass : IBase
        {
            private Item _item = new Item();
            public void DoThing1()
            {
                Console.WriteLine("Do thing1!");
                _item.Item1 = "Part1";
            }
            public void DoThing2()
            {
                Console.WriteLine("Do thing2!");
                _item.Item2 = "Part2";
            }
            public Item GetItem()
            {
                return _item;
            }
        }
    
        public class Item
        {
            public string Item1 { get; set; }
            public string Item2 { get; set; }
        }
    
        public class TestItem
        {
            private readonly IBase objBase;
            public TestItem(IBase obj)
            {
                objBase = obj;
            }
            public void CreateItem()
            {
                objBase.DoThing1();
                objBase.DoThing2();
            }
    
            public Item GetItem()
            {
                return objBase.GetItem();
            }
        }
    

    构建器设计模式演示:

      static async Task Main(string[] args)
      {
         var itemCreator= new TestItem(new MyTestClass());
         itemCreator.CreateItem();
         var item = itemCreator.GetItem();
         Console.ReadKey();
      }
    

    测试结果:

    【讨论】:

    • 分部类的流程中调用分部方法,这种处理来自于生成的分部类。我不想直接调用它,我希望局部方法在其正常工作流程期间被调用并被覆盖,只是相同的局部方法存在于许多不同的局部类正常工作流程中。
    • @Adam,你想在这些部分类创建的时候自动执行ProcessResponse方法吗?如果是这样,只需要调用 BaseClass 构造函数中的 ProcessResponse 方法即可自动执行。我已经更新了我的回复。
    • 不,部分方法执行是部分类工作流的一部分,嵌套在生成的部分类逻辑中。我不想手动或在创建时调用它,我希望在生成的部分类中发生正常的工作流,然后当调用部分方法时,我想在基类中覆盖该方法,所以我不必多个部分类/方法本质上做同样的事情。我将稍微更新一下我的问题,以更好地反映这个工作流程。
    • @Adam,我大概了解您的需求,我已经更新了我的答案,希望对您有所帮助。
    猜你喜欢
    • 2013-09-24
    • 2016-02-23
    • 2012-04-12
    • 2013-06-18
    • 1970-01-01
    • 2020-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多