为了账号安全,请及时绑定邮箱和手机立即绑定

当属性是不同的对象类型时将代码合并到基类中

当属性是不同的对象类型时将代码合并到基类中

C#
扬帆大鱼 2021-11-14 16:59:00
我有几个类都有非常相似的代码,我想知道合并通用代码是否有意义,以及如何去做。每个类都有一个特定的 Model 属性和一个特定的 Service 属性,但除此之外它们几乎相同。这是我正在使用的代码示例:public class Example1 {    public Object1 Model { get; set; }      private Service1 Service {get;set;}    protected bool Create()    {        try        {            Model = Service.Create(Model);            return true;        }        catch(Exception ex)        {            Console.WriteLine(ex.Message);            return false;        }    }}所以说我有 4 个类,它们都具有相同的Create()方法语法,但是属性对象类型都不同。有没有一种方法可以将其转换为 4 个类,每个类都定义了其属性,然后Create()在一个基类中包含该方法?我希望它看起来像下面这样:public class Example1 : Base {    public Object1 Model { get; set; }    private Service1 Service { get; set; }}public class Example2 : Base {    public Object2 Model { get; set; }    private Service2 Service { get; set; }}public class Example3 : Base {    public Object3 Model { get; set; }    private Service3 Service { get; set; }}public class Example4 : Base {    public Object4 Model { get; set; }    private Service4 Service { get; set; }}public class Base {    // Wondering if this would do the trick; could be confusing though    // public object Model { get; set; }    // private object Service { get; set; }    //    protected bool Create()    {        try        {            Model = Service.Create(Model);            return true;        }        catch(Exception ex)        {            Console.WriteLine(ex.Message);            return false;        }    }}但是我对如何在基类中提供属性感到困惑。谢谢你的帮助。如果这是不可能的,那很好,我只是想让我的代码库不那么臃肿。编辑:我认为可能可行的一件事是在 Base 类中将 Model 和 Service 定义为 Object,但后来我担心根据调用属性的位置会出现混淆。
查看完整描述

3 回答

?
莫回无

TA贡献1865条经验 获得超7个赞

您可以使用带有抽象基类的泛型来获得您需要的位置:


public abstract class Base<TModel, TService> where TService: IService

{

    public TModel Model { get; set; }

    private TService Service { get; set; }


    protected bool Create()

    {

        try

        {

            Model = Service.Create(Model);

            return true;

        }

        catch(Exception ex)

        {

            Console.WriteLine(ex.Message);

            return false;

        }

    }

}

您在此处唯一需要更改的是向您的“服务”类型添加一个支持抽象,该类型具有对Create(). 然后,您必须将泛型限制为该抽象(在我上面的示例中,抽象是IService)。你的抽象看起来像这样:


public interface IService

{

    T Create(T input);

}

实现这个抽象基类后,你的实现就像这样:


public class Example1 : Base<Object1, Service1> 

{

    //Code specific to this implementation

}


public class Example2 : Base<Object2, Service2> 

{

    //Code specific to this implementation

}

您永远不会解决的一件事是您的基地将如何实际获取其内容。您可能必须通过构造函数传递它们。我没有在这里提供,因为您也没有,但请记住,您至少需要将服务传递到基础中,以便它可以Create()从传递的服务中调用。


查看完整回答
反对 回复 2021-11-14
?
aluckdog

TA贡献1847条经验 获得超7个赞

如果模型和对象是同一个类,您的示例将起作用。如果 Object1 和 Object2 是不同的类,则可能需要进行一些调整,否则您可能无法实现。


如果它们是同一个类,您可以将 Object 变量设置为 protected 并在每个派生类的构造函数中以不同的方式声明它。


如果它们不是同一个类而是相似的,则 Object1、Object2 等类都可以从一个 Object 类继承,并且上面可以做同样的事情,但是如果 Object1 和 Object2 非常不同,这将没有用。


如果我明白你想要做什么,也许这会有所帮助:


public class Base

{

  public Object model;

  protected Service service;


  protected bool Create()

  {

          try

        {

            Model = Service.Create(Model);

            return true;

        }

        catch(Exception ex)

        {

            Console.WriteLine(ex.Message);

            return false;

        }

  }

}

public class Example1 : Base

{

  public Example1() //Assign specifics in constructor

  {

    model = model1;

    service = service1;

  }

}

public class Example2 : Base

{

  public Example2() //Assign specifics in constructor

  {

    model = model2;

    service = service2;

  }

}

如果这没有帮助,那么也许您正在寻找的是抽象类/方法,但我不确定。


查看完整回答
反对 回复 2021-11-14
?
心有法竹

TA贡献1866条经验 获得超5个赞

interface IModel { }


interface IService<out TModel>

{

    TModel Create(IModel model);

}


interface IModelService<TModel, TService> where TModel : IModel where TService : IService<TModel>

{

    TModel Model { get; set; }

    TService Service { get; set; }

}


class ExampleModel : IModel { }


class ExampleService : IService<ExampleModel>

{

    public ExampleModel Create(TModel model)

    {

        return new ExampleModel();

    }

}


class Example : ExampleBase<ExampleModel, ExampleService>

{


}


abstract class ExampleBase<TModel, TService> : IModelService<TModel, TService> where TModel : IModel where TService : IService<TModel>

{

    public TModel Model { get; set; }

    public TService Service { get; set; }


    protected bool Create()

    {

        //do what you must

    }

}

具有泛型类型参数和用于定义和约束的少数接口的抽象类


查看完整回答
反对 回复 2021-11-14
  • 3 回答
  • 0 关注
  • 165 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信