首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >优雅的对象扩展

优雅的对象扩展
EN

Stack Overflow用户
提问于 2012-06-08 04:33:40
回答 4查看 362关注 0票数 2

问题是-使用当前上下文或场景所需的附加数据来扩展某些对象的最佳方法是什么。

例如,我有一个Product类,它具有ID、Name和Price等基本(核心)属性。产品实例主要用作业务层操作的输入/输出,也用于在其他应用层之间传输信息。

例如,当我需要在GUI中列出带有一些扩展信息的产品时(比如制造商、制造商、一些计算值,等等)我通常让SP返回一组行,然后我需要将这些额外的数据存储在Project实例中。我不想用这些额外的属性来扩展Product类(类最终会变得笨重而不优雅,缺少主要功能),我也不想子类化Product来添加新属性(这会增加某些情况下的复杂性)。

我的想法是放置一个或多个复杂的属性(存储对象及其属性),这些属性将存储用于各种场景的额外数据,但我不确定这是一个好的解决方案。

你有什么建议?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-06-08 04:51:06

您可以考虑构造两个类。一个名为ProductSummary的文件将包含一些产品数据的只读表示:

代码语言:javascript
复制
public class ProductSummary
{
    public int Id { get; }
    public string Name { get; }
    public double Price { get; }
}

第二个类称为ProductDetail,它将包含所有产品数据的读写表示:

代码语言:javascript
复制
public class ProductDetail
{
    public int Id { get; }
    public string Name { get; set; }
    public double Price { get; set; }
    public string Manufacturer { get; set; }

    private ProductDetail()
    {
    }

    public double ComputeValue()
    {
    }

    public static ProductDetail(ProductSummary summary)
    {
        var newProduct = new ProductDetail();
        // load Product data using primary key from summary.Id      
        // populate newProduct from loaded data
        return newProduct;
    }
}

事实证明,ProuctSummary类是一个轻量级的、只读的关键产品信息容器。ProductSummary数据的集合可用于填充列表等。

一旦需要编辑产品,您可以使用ProductSummary对象中的ID来加载一个权重较大的ProductDetail类,该类可用于编辑场景。

这可能看起来像是多余的工作,但请考虑到类应该为特定的用例而设计。如果您有一个轻量级只读摘要类的用例,一个可编辑类的单独用例,那么您可能希望考虑两个单独的类。

票数 1
EN

Stack Overflow用户

发布于 2012-06-08 04:37:47

听起来你遇到了模型vs ViewModel的问题。ViewModels仅用于显示目的,因此具有额外属性的视图模型并将模型映射到UI级别的视图模型是有效的设计。

票数 2
EN

Stack Overflow用户

发布于 2012-06-08 04:40:03

我个人会扩展这个类,但您也可以这样做:

代码语言:javascript
复制
public class Product
{
    ...

    public List<ProductProperty> AdditionalProperties { get; set; }
}

class ProductProperty
{
    public string Name { get; set; }
    public object Data { get; set; }
}

请记住,绝对不是最佳实践;)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10939455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档