具有多态性的通用接口来处理对象

时间:2013-01-19 00:56:01

标签: c# interface polymorphism abstraction

删除上一篇文章;的更新


所以我有一个独特的问题,虽然可能相当常见。属性很可能是最常用的代码;因为它要求我们的数据保持恒定的存储空间。所以我想我怎么能实现这一点;然后我想到了Generics如何轻松地创造生活。不幸的是,我们不能仅仅使用Generic中的Property而不需要一些繁重的工作。所以这是我的解决方案/问题;因为我不确定这是最好的方法 - 这就是我寻求同行评论的原因。

请记住,应用程序将是巨大的;这是一个非常简单的例子。

摘要:

表示层:界面将包含一系列字段;甚至是通过网络服务到我们的数据库的数据。

// Interface:
public interface IHolder<T>
{
     void objDetail(List<T> obj);
}

所以我最初的想法是一个界面,它允许我一般地处理我的每个对象。

// User Interface:
public class UI : IHolder
{
    void objDetail(List<object> obj)
    {
        // Create an Instance
        List<object> l = new List<object>();
        // Add UI Fields:
        l.Add(Guid.NewGuid());
        l.Add(txtFirst.Text);
        l.Add(txtLast.Text);
        // l to our obj        
        obj = l;
        return;
     }
}

现在我有了一个界面;我们的UI已经使用它来放入信息。现在;这就是我好奇心的根源被扔进混合物的地方。

// Create an Object Class
public class Customer : IHolder
{
     // Member Variable:
     private Guid _Id;
     private String _First;
     private String _Last;

     public Guid Id
     { 
           get { return _Id; }
           set { _Id = value; }
     }
     public String First
     {
           get { return _First; }
           set { _First = value; }
     }
     public String Last
     {
           get { return _Last; }
           set { _Last = value; }
     }

     public virtual objDetail(List<Customer> obj)
     {
         // Enumerate through List; and assign to Properties.
     }
}

现在这是我认为很酷的地方;如果我可以使用多态性来使用相同的接口;但覆盖它以不同方式执行该方法。所以接口使用Generic;能够将变形转换为给定的对象类。

现在我们的对象类;可以转向我们的实体界面,它将处理基本的Crud操作。

我知道这个例子对我的意图不是最好的;因为你真的不需要使用多态性。但是,这是整体想法/目标......

  • 存储表示层UI字段值的接口
  • 将属性实现为所需类
  • 在我的班级周围创建一个包装器;可以是Polymorphed。
  • 变形为通用的Crud操作

我走在正确的道路上;这是禁忌吗?我不应该这样做吗?我的应用程序需要保存每个实例;但是我需要灵活地快速适应而不会破坏流程中的每个实例。这就是我认为我可以解决这个问题的方式。有什么想法吗?建议?我在这里错过了一个概念吗?还是我过度思考?我是否错过了这条船并完全错误地实现了我的想法?那就是我失去的地方......

1 个答案:

答案 0 :(得分:0)

在思考了这个场景之后,我想到了什么可以提供这种灵活性,同时仍然确保代码针对修改和业务进行了优化。我不确定这是正确的解决方案,但似乎有效。它不仅有效,而且效果很好。它看起来相当强大。

这种方法何时有用?那么,当您打算将用户界面与逻辑分离时。我将逐步构建每个方面,以便您可以看到整个结构。

public interface IObjContainer<T>
{
     void container(List<T> object);
}

这种特殊的结构很重要。因为它会将所有需要的内容存储到其中。

首先,您将创建一个包含一系列字段的表单。

  • 个人信息
  • 地址信息
  • 付款信息
  • 订单信息

因为您可以看到所有这些都可以是单独的数据库表,但属于您正在操作的类似实体模型。这很常见。

因此,关注的隔离将开始略微显示,字段将被操纵并通过接口传递。

public interface IPersonalInformation
{
      public string FirstName { get; set; }
      public string LastName  { get; set; }
}

所以基本上接口将其变量传递给接口。因此,您最终会设置一个接口来处理您希望调用的整个表单或单个接口,以便它们可以重复使用。

所以现在你有一系列接口,或者只有一次接口。但它包含要使用的所有这些变量。所以你现在要创建一个类:

public class CustomerProperties: IPersonalInformation, IOrderInformation
{
    // Implement each Interface Property
}

现在您已经创建了一个容纳所有值的容器。这个容器的优点是你可以在应用程序中为另一个类重用相同的值,或者选择不同的类。但它会在逻辑上将用户界面分开。

所以基本上这类似于存储库。

现在您可以获取这些值并执行所需的逻辑。现在变得美妙的是,在你执行逻辑之后,将对象传递到我们的通用列表中。然后,您只需在另一个类中为您的目标实现该方法,并遍历您的列表。

诚实是它似乎运作良好并且很好地分离。我觉得做一些类似于普通存储库和工作单元的工作要做很多工作,这回答了问题,但不管天气与否,它都适合你的项目我会查看存储库,工作单元,关注点,控制反转和依赖注入。他们可能采用同样的方法清洁。


<强>更新

在我写完之后我想到了它,我注意到你实际上可以绕过一系列接口将这些属性值实现到通用列表结构中;但这会引入一致性问题,因为您必须按顺序了解每次传递的数据。这是可能的,但可能并不理想。