谁能给一个很好的例子来说明用泛型类做什么?
本文关键字:说明 泛型类 什么 很好 一个 | 更新日期: 2023-09-27 18:10:37
我们最近学习了c#中的泛型类,但是我们的老师没有提到它们的用途。我真的找不到任何好的例子,如果有人帮助我,我会非常高兴:)
你是否创建了自己的泛型类,你用它来做什么?
一些代码示例将使我和我的同学,真的很高兴!原谅我的英语不好,我来自瑞典:)
编程快乐!
对不起,我想我可以把问题写得更好一点。我熟悉泛型集合。我只是想知道你自己的泛型类可以用来做什么。
和感谢你的MSDN链接,我确实在发布问题之前阅读了它们,但也许我错过了什么?我再看一看!
泛型集合
集合的泛型非常有用,因为它们允许编译时类型安全。这很有用,原因如下:在检索值时不需要强制转换。这不仅提高了性能,而且还消除了运行时出现类型转换异常的风险
当值类型被添加到非泛型列表(如ArrayList)时,值必须被框起来。这意味着它们被存储为引用类型。这也意味着不仅值被存储在内存中,而且对它的引用也被存储在内存中,因此使用了比必要更多的内存。使用通用列表可以消除这个问题。
泛型类
泛型类对于为不同类型重用公共代码很有用。以一个简单的非通用工厂类为例:public class CatFactory
{
public Cat CreateCat()
{
return new Cat();
}
}
我可以使用泛型类为(几乎)任何类型提供工厂:
public class Factory<T> where T : new()
{
public T Create()
{
return new T();
}
}
在这个例子中,我在类型参数t上放置了new()的泛型类型约束。这要求泛型类型包含一个无参数构造函数,使我能够在不知道类型的情况下创建实例。
因为你说你是瑞典人,我想我应该举一个整合宜家家具的例子。你的成套沙发在北美很受欢迎,所以我想我应该回馈一些东西:)想象一下,一个班级代表了一种特殊的组装桌椅的工具包。为了保持真实性,我甚至会使用毫无意义的瑞典语同音异义词:
// interface for included tools to build your furniture
public interface IToolKit {
string[] GetTools();
}
// interface for included parts for your furniture
public interface IParts {
string[] GetParts();
}
// represents a generic base class for IKEA furniture kit
public abstract class IkeaKit<TContents> where TContents : IToolKit, IParts, new() {
public abstract string Title {
get;
}
public abstract string Colour {
get;
}
public void GetInventory() {
// generic constraint new() lets me do this
var contents = new TContents();
foreach (string tool in contents.GetTools()) {
Console.WriteLine("Tool: {0}", tool);
}
foreach (string part in contents.GetParts()) {
Console.WriteLine("Part: {0}", part);
}
}
}
// describes a chair
public class Chair : IToolKit, IParts {
public string[] GetTools() {
return new string[] { "Screwdriver", "Allen Key" };
}
public string[] GetParts() {
return new string[] {
"leg", "leg", "leg", "seat", "back", "bag of screws" };
}
}
// describes a chair kit call "Fnood" which is cyan in colour.
public class Fnood : IkeaKit<Chair> {
public override string Title {
get { return "Fnood"; }
}
public override string Colour {
get { return "Cyan"; }
}
}
public class Snoolma : IkeaKit<Chair> {
public override string Title {
get { return "Snoolma "; }
}
public override string Colour {
get { return "Orange"; }
}
}
好了,现在我们已经掌握了制造便宜家具所需的所有细节:
var fnood = new Fnood();
fnood.GetInventory(); // print out tools and components for a fnood chair!
(是的,缺乏说明和椅子套件中的三条腿是故意的。)
如果有一个List对象(非泛型),可以在其中存储任何可以强制转换为object的内容,但是在编译时无法知道将从中得到什么类型的内容。相比之下,如果一个人有一个泛型的List
此外,如果泛型类的泛型类型参数恰好是值类型,使用泛型类型可以消除对对象的强制转换,这个过程称为"装箱",将值类型实体转换为引用类型对象;装箱有点慢,有时会改变值类型对象的语义,因此最好尽可能避免。
请注意,尽管SomeDerivedClass类型的对象可以替代TheBaseClass,但一般来说,genericsomederivedclass
- 派生类型的数组可以传递给期望基类型数组的例程,只要这些例程不试图将任何非适当派生类型的项存储到这些数组中。
- 接口可以声明为具有"out"类型参数,如果这些接口唯一要做的就是返回("输出")该类型的值。长颈鹿供应商可以代替动物供应商,因为它所要做的就是供应长颈鹿,而长颈鹿反过来又可以代替动物。这些接口相对于这些参数是"协变的"。
此外,如果接口所做的唯一事情是按值接受该类型的参数,则可以声明接口来声明"In"类型参数。吃动物的人可以用吃长颈鹿的人来代替,因为它能吃所有的动物,因此也能吃所有的长颈鹿。这些接口相对于这些参数是"逆变的"。
最常见的例子是List, Dictionary等集合。所有这些标准类都是使用泛型实现的。
的另一个用途是为排序和比较等操作编写更通用的实用程序类或方法。
这里有一篇微软的文章可能会有所帮助:http://msdn.microsoft.com/en-us/library/b5bx6xee%28v=vs.80%29.aspx
我看到的最大好处是泛型的编译时安全性,正如@Charlie提到的。我还使用了一个泛型类来实现DataReader,用于批量插入到数据库中。框架中有很多示例。假设您需要实现一个整数列表,然后是一个字符串列表……然后是你们客户阶层的名单…等。那会很痛苦的。
但是,如果你实现一个泛型列表,问题就会在更短的时间内解决,用更少的代码,你只需要测试一个类。
也许有一天你需要实现自己的队列,其中包含关于每个元素优先级的规则。那么,如果可能的话,将这个队列设置为泛型是个好主意。
这是一个非常简单的示例,但是随着您编码技能的提高,您将看到拥有(例如)一个通用存储库(这是一个设计模式)是多么有用。
不是每个程序员都制作泛型类,但是相信我,当你需要它的时候,你会很高兴使用这样的工具。
仿制药的真实世界的例子。
想象你有一个笼子,里面有许多不同的鸟(鹦鹉、鸽子、麻雀、乌鸦、鸭子)。
现在你被分配了一项工作,将鸟从上面指定的笼子中移动到单独的笼子(专门为单个鸟建造的)。
(非通用列表的问题)把特定的鸟从旧笼子里抓出来,转移到为它做的笼子里,这是一项乏味的工作。(哪一种鸟到哪一个笼子——c#中的类型转换)
<<p> 通用列表/strong>现在假设你有一个单独的笼子给每只鸟,你想转移到其他笼子为它。这将是一项简单的任务,并且不需要花费时间(不需要类型转换—我的意思是将鸟映射到笼子中)。
我的朋友不是程序员,我想解释什么是泛型?我会这样解释他的泛型。因此,这是使用泛型的真实场景。
"隔壁街就有一家制造商。"他能制造任何汽车。但有一次他只能制造一种汽车。上周,他为我制造了一辆汽车,这周他为我叔叔制造了一辆卡车。就像我说的,这个制造单位是通用的,它可以生产客户指定的东西。但请注意,当你去接近这个制造商时,你必须带一种你需要的汽车。否则根本不可能接近他。
看看微软的这篇文章。你已经清楚地解释了它们的用途和使用时间。http://msdn.microsoft.com/en-us/library/ms172192.aspx
各种泛型集合是泛型使用的最好例子,但是如果你想要一个你可能自己生成的例子,你可以看看我对这个老问题的回答:
委托在c或其他语言中的使用
不确定这是否是泛型使用的一个特别好的例子,但我发现自己偶尔会这样做。
您是在谈论基类(或者可能是抽象类)吗?作为一个类,你会建立其他类(子类)吗?
如果是这种情况,那么您将创建一个基类来包含对继承它的类通用的方法和属性。例如,一个car类将包括车轮、发动机、门等。然后,您可能会创建一个sportsCar子类,该子类继承car类,并添加诸如扰流器、涡轮增压器等属性。
http://en.wikipedia.org/wiki/Inheritance_ (object-oriented_programming)在这里输入链接描述
如果没有上下文,很难理解你所说的"泛型类"是什么意思。