首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解.Net泛型-银行领域

理解.Net泛型-银行领域
EN

Stack Overflow用户
提问于 2012-02-25 20:39:31
回答 4查看 1.4K关注 0票数 2

这是一次学习泛型的尝试(用.Net 4.0)。我已经编程大约4.5年了。到目前为止,我还没有在实时项目中使用泛型。一直以来,我一直在读一些关于泛型的文章,并试着去理解它。问题是--大多数人都试图解释泛型中可用的各种语法。他们用方格、圆圈和形状等例子来解释。

现在我有机会设计一个小应用程序。我想在那里用泛型。我确实认为泛型在我的新项目中很有可能成为一个很好的候选人。

我现在想出的是一个来自银行领域的例子,目的是了解泛型。我正在试着理解以下4条。

1)泛型类

2)一般方法

3)泛型接口

4)一般代表

编辑:与类型无关的操作是泛型的好候选者。这是我在下面的例子中遗漏的最大一点之一。

我为“泛型类”创建了一个示例。您能帮助其他三个项目的简单例子与银行域吗?

注意:在使用泛型类时,我了解到它有助于开闭原理。即使我添加了新的帐户类型,泛型类也需要更改。变化的逻辑(利息计算)在特定的类中。

注意:在下面,语法可能不正确,因为它在没有Visual的情况下键入了它。但这个概念是正确的。

编辑:基于"BankAccount“类的角色,会更好地命名”BankAccount“类吗?有什么反模式吗?

泛型类--以银行域为例

代码语言:javascript
复制
Public Interface IBankAccount
{
Public int Interest;
Public Int DepositedAmount;
     Public int DurationInMonth;
}

Public class FixedAccount: IbankAccount
{
Public int Interest 
   {
    Get
    {
   Return  (DurationInMonth*0.5)
    }
    }

Public Int DepositedAmount  {get;set};
    Public int DurationInMonth {get;set};
 }

 Public class SavingsAccount: IbankAccount
{
Public int Interest 
   {
    Get
    {
 Return  ((DurationInMonth/2)*0.1)
    }
   }

Public Int DepositedAmount  {get;set};
    Public int DurationInMonth {get;set};
  }


Public  Class BankAccount<T> Where T: IbankAccount
{
T  account = new T();

Public void CreateAccount(int duration, int amount)
   {
account. DurationInMonth = duration;
account. DepositedAmount   = amont;
int interestVal = account. Interest;
SaveToDatabase (T);

  }

 }

阅读:

  1. 什么时候使用泛型和继承是合适的?
  2. 泛型与继承(当不涉及集合类时)
  3. https://codereview.stackexchange.com/questions/8797/how-to-make-sure-that-this-code-conforms-to-open-close-principle
  4. 满足开放/封闭原则的工厂模式?
  5. 我在C#的仿制和铸造方面遇到了一些困难
  6. 决定何时何地使用泛型食谱—Deciding_When_and_Where_to_Use_Generics_Problem
  7. 通过泛型和多态重用代码
  8. 并行继承链中的多态性与类型安全性
  9. 使用C#泛型扩展?
  10. C#的泛型与多态性:矛盾?
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-02-26 10:09:05

只是我的两分钱,因为@Lijo让我在这里发表评论。

以上大部分的答案,我都会去做。但是概括地说,泛型是行为的无类型的重用。您的泛型类型必须是IBankAccount -which,这是一个非常具体的接口--这可能是不对的。我并不是说不能对接口使用限制,但该接口本身将是一个非常通用的接口,如IDisposableIConvertible

票数 1
EN

Stack Overflow用户

发布于 2012-02-25 20:57:36

仅仅因为“我想使用仿制药”就把仿制品变成了一个项目,这通常是个坏主意。为正确的工作使用正确的工具。现在,道具试着学点新东西。

上面说..。基本上,“泛型”是一种在编写方法时不指定底层类型的方法、类(等等)。这是一种将算法与数据类型分离的好方法。

例如,交换方法。基本上,无论交换算法是在什么类型上操作,交换算法都是相同的。因此,这将是泛型(如ListDictionary等)的一个很好的候选。

因此,int的交换应该如下所示:

代码语言:javascript
复制
void Swap(ref int left, ref int right)
{
   int temp = left;
   left = right;
   right = temp;
}

现在,您可以为其他数据类型(floatdouble等)编写重载,也可以将其改为泛型并编写一次,这样几乎所有数据类型都能工作:

代码语言:javascript
复制
void Swap<_type>(ref _type left, ref _type right)
{
   _type temp = left;
   left = right;
   right = temp;
}

现在,您的示例代码无法工作:

代码语言:javascript
复制
Public void CreateAccount(int duration, int amount)
{
   T.DurationInMonth = duration;
   T.DepositedAmount   = amont;
   int interestVal = T.Interest;
   SaveToDatabase (T);
}

在这里,T是类型,而不是对象的实例。如果您替代了T,则会更清楚地了解正在发生的事情:

代码语言:javascript
复制
Public void CreateAccount(int duration, int amount)
{
   IbankAccount.DurationInMonth = duration;
   IbankAccount.DepositedAmount   = amont;
   int interestVal = IbankAccount.Interest;
   SaveToDatabase (IbankAccount);
}

当你真正想要的是:

代码语言:javascript
复制
Public void CreateAccount(int duration, int amount)
{
   account.DurationInMonth = duration;
   account.DepositedAmount   = amont;
   int interestVal = account.Interest;
   SaveToDatabase (account);
}

您看,我们在这里调用类帐户实例的方法,而不是泛型IbankAccount类型的方法。

票数 3
EN

Stack Overflow用户

发布于 2012-02-25 20:55:14

0)将.NET的泛型集合作为容器类型使用:假设要列出与特定客户关联的所有帐户,并在数据网格中显示它们。如果您想查看多个客户的帐户,List<IBankAccount>Dictionary<ICustomerID,IBankAccount>将是有帮助的。

1,2)创建您自己的泛型类和泛型方法:假设您希望执行涉及所有帐户的计算,以便生成报告。在这个特别的报告中,数值精度并不重要,速度也很重要。所以您可以使用Single insted of Decimal。在这种情况下,要使计算中涉及的类独立于所使用的数值类型,使用泛型参数比继承更自然。伪码:

代码语言:javascript
复制
public class MetricCalculator<T>{
    private bool  _dirty;
    private T _cachedValue;

    T PerformCalculation(){
        if( !_dirty )
            return cachedValue;
        T metric = 0;
        foreach( IBankAccount account in AccountMapper.GetAll() ){
            T += account.Foo * accound.Bar;
        }
        _cachedValue = metric;
        return metric;
    }
}

在本例中,MetricCalculator是一个泛型类,因为它的一个数据成员是参数化类型的。如果使用的值没有更改,则使用该成员避免重复计算。还有一个泛型方法,它执行计算而不考虑所使用的数字类型。如果不需要缓存该值,则可以只使用带有泛型方法的公共类。我把两者结合起来只是为了节省空间。

3)泛型接口:假设您希望完全解耦所有组件(例如,实现控制反转 );在这种情况下,如果您有跨程序集使用的泛型类,则需要通过泛型接口使用它们。另一个例子是,如果您需要编写自定义数据结构或迭代器,但我怀疑您是否需要这样做。

4)泛型事件:返回到MetricCalculator示例,假设要使用通知计算已完成的事件通知某个观察者对象,并传递结果。它类似于一个通常的事件,但是在引发事件时,您会传递一个类型为T的参数。注意事项:如果可用,最好使用C#5的异步等待功能。

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

https://stackoverflow.com/questions/9447865

复制
相关文章

相似问题

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