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

我有几个类都有非常相似的代码,我想知道合并通用代码是否有意义,以及如何去做。每个类都有一个特定的 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,但后来我担心根据调用属性的位置会出现混淆。


扬帆大鱼
浏览 166回答 3
3回答

莫回无

您可以使用带有抽象基类的泛型来获得您需要的位置:public abstract class Base<TModel, TService> where TService: IService{&nbsp; &nbsp; public TModel Model { get; set; }&nbsp; &nbsp; private TService Service { get; set; }&nbsp; &nbsp; protected bool Create()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; try&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Model = Service.Create(Model);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return true;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; catch(Exception ex)&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine(ex.Message);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return false;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}您在此处唯一需要更改的是向您的“服务”类型添加一个支持抽象,该类型具有对Create(). 然后,您必须将泛型限制为该抽象(在我上面的示例中,抽象是IService)。你的抽象看起来像这样:public interface IService{&nbsp; &nbsp; T Create(T input);}实现这个抽象基类后,你的实现就像这样:public class Example1 : Base<Object1, Service1>&nbsp;{&nbsp; &nbsp; //Code specific to this implementation}public class Example2 : Base<Object2, Service2>&nbsp;{&nbsp; &nbsp; //Code specific to this implementation}您永远不会解决的一件事是您的基地将如何实际获取其内容。您可能必须通过构造函数传递它们。我没有在这里提供,因为您也没有,但请记住,您至少需要将服务传递到基础中,以便它可以Create()从传递的服务中调用。

aluckdog

如果模型和对象是同一个类,您的示例将起作用。如果 Object1 和 Object2 是不同的类,则可能需要进行一些调整,否则您可能无法实现。如果它们是同一个类,您可以将 Object 变量设置为 protected 并在每个派生类的构造函数中以不同的方式声明它。如果它们不是同一个类而是相似的,则 Object1、Object2 等类都可以从一个 Object 类继承,并且上面可以做同样的事情,但是如果 Object1 和 Object2 非常不同,这将没有用。如果我明白你想要做什么,也许这会有所帮助:public class Base{&nbsp; public Object model;&nbsp; protected Service service;&nbsp; protected bool Create()&nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; try&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Model = Service.Create(Model);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return true;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; catch(Exception ex)&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine(ex.Message);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return false;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; }}public class Example1 : Base{&nbsp; public Example1() //Assign specifics in constructor&nbsp; {&nbsp; &nbsp; model = model1;&nbsp; &nbsp; service = service1;&nbsp; }}public class Example2 : Base{&nbsp; public Example2() //Assign specifics in constructor&nbsp; {&nbsp; &nbsp; model = model2;&nbsp; &nbsp; service = service2;&nbsp; }}如果这没有帮助,那么也许您正在寻找的是抽象类/方法,但我不确定。

心有法竹

interface IModel { }interface IService<out TModel>{&nbsp; &nbsp; TModel Create(IModel model);}interface IModelService<TModel, TService> where TModel : IModel where TService : IService<TModel>{&nbsp; &nbsp; TModel Model { get; set; }&nbsp; &nbsp; TService Service { get; set; }}class ExampleModel : IModel { }class ExampleService : IService<ExampleModel>{&nbsp; &nbsp; public ExampleModel Create(TModel model)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; return new ExampleModel();&nbsp; &nbsp; }}class Example : ExampleBase<ExampleModel, ExampleService>{}abstract class ExampleBase<TModel, TService> : IModelService<TModel, TService> where TModel : IModel where TService : IService<TModel>{&nbsp; &nbsp; public TModel Model { get; set; }&nbsp; &nbsp; public TService Service { get; set; }&nbsp; &nbsp; protected bool Create()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; //do what you must&nbsp; &nbsp; }}具有泛型类型参数和用于定义和约束的少数接口的抽象类
打开App,查看更多内容
随时随地看视频慕课网APP