这是一次学习泛型的尝试(用.Net 4.0)。我已经编程大约4.5年了。到目前为止,我还没有在实时项目中使用泛型。一直以来,我一直在读一些关于泛型的文章,并试着去理解它。问题是--大多数人都试图解释泛型中可用的各种语法。他们用方格、圆圈和形状等例子来解释。
现在我有机会设计一个小应用程序。我想在那里用泛型。我确实认为泛型在我的新项目中很有可能成为一个很好的候选人。
我现在想出的是一个来自银行领域的例子,目的是了解泛型。我正在试着理解以下4条。
1)泛型类
2)一般方法
3)泛型接口
4)一般代表
编辑:与类型无关的操作是泛型的好候选者。这是我在下面的例子中遗漏的最大一点之一。
我为“泛型类”创建了一个示例。您能帮助其他三个项目的简单例子与银行域吗?
注意:在使用泛型类时,我了解到它有助于开闭原理。即使我添加了新的帐户类型,泛型类也需要更改。变化的逻辑(利息计算)在特定的类中。
注意:在下面,语法可能不正确,因为它在没有Visual的情况下键入了它。但这个概念是正确的。
编辑:基于"BankAccount“类的角色,会更好地命名”BankAccount“类吗?有什么反模式吗?
泛型类--以银行域为例
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);
}
}阅读:
发布于 2012-02-26 10:09:05
只是我的两分钱,因为@Lijo让我在这里发表评论。
以上大部分的答案,我都会去做。但是概括地说,泛型是行为的无类型的重用。您的泛型类型必须是IBankAccount -which,这是一个非常具体的接口--这可能是不对的。我并不是说不能对接口使用限制,但该接口本身将是一个非常通用的接口,如IDisposable或IConvertible。
发布于 2012-02-25 20:57:36
仅仅因为“我想使用仿制药”就把仿制品变成了一个项目,这通常是个坏主意。为正确的工作使用正确的工具。现在,道具试着学点新东西。
上面说..。基本上,“泛型”是一种在编写方法时不指定底层类型的方法、类(等等)。这是一种将算法与数据类型分离的好方法。
例如,交换方法。基本上,无论交换算法是在什么类型上操作,交换算法都是相同的。因此,这将是泛型(如List、Dictionary等)的一个很好的候选。
因此,int的交换应该如下所示:
void Swap(ref int left, ref int right)
{
int temp = left;
left = right;
right = temp;
}现在,您可以为其他数据类型(float、double等)编写重载,也可以将其改为泛型并编写一次,这样几乎所有数据类型都能工作:
void Swap<_type>(ref _type left, ref _type right)
{
_type temp = left;
left = right;
right = temp;
}现在,您的示例代码无法工作:
Public void CreateAccount(int duration, int amount)
{
T.DurationInMonth = duration;
T.DepositedAmount = amont;
int interestVal = T.Interest;
SaveToDatabase (T);
}在这里,T是类型,而不是对象的实例。如果您替代了T,则会更清楚地了解正在发生的事情:
Public void CreateAccount(int duration, int amount)
{
IbankAccount.DurationInMonth = duration;
IbankAccount.DepositedAmount = amont;
int interestVal = IbankAccount.Interest;
SaveToDatabase (IbankAccount);
}当你真正想要的是:
Public void CreateAccount(int duration, int amount)
{
account.DurationInMonth = duration;
account.DepositedAmount = amont;
int interestVal = account.Interest;
SaveToDatabase (account);
}您看,我们在这里调用类帐户实例的方法,而不是泛型IbankAccount类型的方法。
发布于 2012-02-25 20:55:14
0)将.NET的泛型集合作为容器类型使用:假设要列出与特定客户关联的所有帐户,并在数据网格中显示它们。如果您想查看多个客户的帐户,List<IBankAccount>或Dictionary<ICustomerID,IBankAccount>将是有帮助的。
1,2)创建您自己的泛型类和泛型方法:假设您希望执行涉及所有帐户的计算,以便生成报告。在这个特别的报告中,数值精度并不重要,速度也很重要。所以您可以使用Single insted of Decimal。在这种情况下,要使计算中涉及的类独立于所使用的数值类型,使用泛型参数比继承更自然。伪码:
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的异步等待功能。
https://stackoverflow.com/questions/9447865
复制相似问题