泛型泛型问题[英] A Generic Generics Problem

问题描述

大家好,
我写作是因为我对 C# 的实现感到沮丧
泛型,需要一个解决方法.我来自 Java 背景,并且
目前正在编写需要
的应用程序的一部分Java 和 C# 中的实现.我已经完成了 Java 方面的工作,并且
它工作得很好,C# 端就快到了.我的问题
遇到与
的实现差异有关两种语言之间的泛型.我想使用一个类
是用泛型定义的,只是不用声明它的类型
无处不在.

例如,假设我正在使用 IList,并且在一个位置,我
使用 <String> 的泛型类型声明它.现在,在不同的
类,我想将该列表存储为一个字段,但我不想
存储与其关联的类型.如果我需要存储类型
带字段(如<pre>private IList<StringfieldName;</pre>,
那么存储它的类将被要求是通用的,
并且任何存储它的实例的类也需要是
通用的,无限的,直到我所有的代码都被通用
地方(我不想要!).现在,这里展示的例子是
很容易解决,因为 IList 接口被声明了两次(一次在
System.Collections 作为非泛型版本,并且曾经在
System.Collections.Generic 作为通用版本).

这是 Java 等价物的代码示例,后跟
(非法)所需的 C# 语法:
<预>
公共接口 ExampleInterface<Type>
{
//这里有一些成员方法
}

公共类 ExampleImpl<Typeimplements ExampleInterface<Type>
{
//这里的方法实现
}

公共类 SampleClass
{
私有ExampleInterface mExampleInterface;

公共无效 setExampleInterface(ExampleInterface
pExampleInterface)
{
mExampleInterface = pExampleInterface;
}
}

公共类 SampleBuilder
{
私有 SampleClass mSampleClass;

公共 SampleBuilder()
{
mSampleClass = new SampleClass();
mSampleClass.setExampleInterface(new ExampleImpl());
}
}

//结束Java示例
</pre>

所需的 C# 实现:
<预>
公共接口 ExampleInterface<Type>
{
//这里有一些成员方法
}

公共类 ExampleImpl<Type: ExampleInterface<Type>
{
//这里的方法实现
}

公共类 SampleClass
{
私有示例接口示例接口;

public void SetExampleInterface(ExampleInterface exampleInterface)
{
this.exampleInterface = exampleInterface;
}
}

公共类 SampleBuilder
{
私有SampleClass sampleClass;

公共 SampleBuilder()
{
this.sampleClass = new SampleClass();
this.sampleClass.SetExampleInterface(new
ExampleImpl());
}
}

//结束 C# 示例
</pre>

因此,在 C# 示例中,如果我被迫存储
的实例<pre>ExampleInterface</pre 带有它的泛型类型,然后
<pre>SampleClass</pre 必须定义为 Generic 类,并且
以其泛型类型存储在 SampleBuilder 中,然后将强制
<pre>SampleClass</preto也被定义为Generic类,所以
等等.

有什么办法可以做我想做的事,还是我被迫放弃
在 C# 中完全使用泛型?

提前致谢!
尊敬的,
Robert Kausch

推荐答案

2007 年 5 月 17 日 12:10:50 -0700,"rk*****@gmail.com"<rk*****@gmail.com>
写道:
>大家好,
我正在写作,因为我对 C# 的
泛型的实现感到沮丧,需要一种解决方法.我来自 Java 背景,
目前正在编写一个应用程序的一部分,该应用程序需要
同时使用 Java 和 C# 实现.我已经完成了 Java 方面的工作,
它工作得非常好,而 C# 方面几乎就在那里.我
遇到的问题与两种语言之间
泛型的实现差异有关.我想使用一个
用泛型定义的类,而不必在任何地方声明它的类型.

例如,假设我正在使用 IList,并且在一个位置,我
使用通用类型 <String> 声明它.现在,在不同的
类中,我想将该列表存储为一个字段,但我不想
存储与其关联的类型.如果我需要将类型
与字段一起存储(例如<pre>private IList那么将需要存储它的类是通用的,
并且任何存储它的实例的类也需要是
通用的,无限的,直到我的所有代码在整个
地方都通用(我不这样做''不想要!).现在,这里提供的示例
很容易解决,因为 IList 接口被声明了两次(一次在
System.Collections 作为非泛型版本,一次在
System.Collections.Generic 作为通用版本).

这里是 Java 等效的代码示例,后跟
(非法)所需的 C# 语法:

pre>
public interface ExampleInterface<Type>
{
//这里的一些成员方法
}

public class ExampleImpl{
//这里的方法实现
}

公共类SampleClass
{
私有ExampleInterface mExampleInterface;

公共无效 setExampleInterface(ExampleInterface
pExampleInterface)
{
mExampleInterface = pExampleInterface;
}
}

公共类 SampleBuilder
{
私有 SampleClass mSampleClass;

公共 SampleBuilder()
{
mSampleClass = new SampleClass();
mSampleClass.setExampleInterface(new ExampleImpl());
}
}

//结束 Java 示例
</pre>

所需的 C# 实现:
<pre>
public interface ExampleInterface<Type>
{
//这里的一些成员方法
}

public class ExampleImpl<Type: ExampleInterface<Type>
{
//这里的方法实现
}

公共类SampleClass
{
私有示例接口示例接口;

public void SetExampleInterface(ExampleInterface exampleInterface)
{
this.exampleInterface = exampleInterface;
}
}

公共类 SampleBuilder
{
私有SampleClass sampleClass;

公共 SampleBuilder()
{
this.sampleClass = new SampleClass();
this.sampleClass.SetExampleInterface(new
ExampleImpl());
}
}

//结束 C# 示例
</pre>

所以,在 C# 示例中,如果我被迫存储
<pre>ExampleInterface</pre的实例及其泛型,则
<pre>SampleClass</pre必须定义为Generic类,并
存储在SampleBuilder中具有其泛型类型,然后将强制
<pre>SampleClass</preto 也被定义为泛型类,等等
等等.

有吗有什么方法可以做我想做的事,还是我被迫放弃
在 C# 中完全使用泛型?

提前致谢!
尊敬的,
罗伯特·考施
也许:
公共接口 ExampleInterfaceNG {}

公共接口 ExampleInterface<T: ExampleInterfaceNG {}

公共类 SampleClass
{
私有ExampleInterfaceNG exampleInterface;

公共无效 SetExampleInterface(ExampleInterfaceNG
示例接口)
{
this.exampleInterface = exampleInterface;
}
}

--
路德维希
http://www.coders-lab.be

[删除了无效的microsoft.public.dotnet.csharp.general
新闻组]

rk*****@gmail.com <rk*****@gmail.com 写道:

<snip>
有什么办法可以做我想做的事,还是我被迫放弃
在 C# 中完全使用泛型?
好吧,您已经有效地放弃了在 Java 中使用泛型,
通过使用原始类型而不是泛型类型.Java 泛型是
相对较弱,仅在使用类型擦除的编译时工作.C#
.NET 泛型更强大,将类型信息维护在
执行时间也是.

现在,您要做的是有效地放弃类型安全
泛型通过说

提供私有示例接口示例接口;

这意味着什么信息?你会如何使用它?你没有
不再知道任何方法采用什么类型.

所以基本上,相当于Java代码的就是放弃泛型.
我会在 C# 代码中坚持使用真正的泛型——它只会"感染"你
使用泛型,只要你想要你正在谈论的类型
是通用的.一旦你到了你就知道你是哪种真实类型的阶段了
想用,可以自己指定,不再做类型
通用的.基本上,如果你想要仿制药的好处,你必须
能够为类的用户提供一种指定
的方式键入要用于这些好处的参数,如果你这样做,你就不能这样做
没有类型参数.

--
Jon Skeet - <sk***@pobox.com>
http://www.pobox.com/~skeet 博客:http://www.msmvps.com/jon.skeet
如果回复群,请不要也给我发邮件

5 月 17 日下午 1:49,Jon Skeet [C# MVP] <s...@pobox.com 写道:
<snip>
好吧,您已经有效地放弃了在 Java 中使用泛型,
通过使用原始类型而不是泛型类型.Java 泛型是
相对较弱,仅在使用类型擦除的编译时工作.C#
.NET 泛型更强大,将类型信息维护在
执行时间也是.

现在,您要做的是有效地放弃类型安全
泛型通过说

提供私有示例接口示例接口;

这意味着什么信息?你会如何使用它?你没有
不再知道任何方法采用什么类型.

所以基本上,相当于Java代码的就是放弃泛型.
我会在 C# 代码中坚持使用真正的泛型——它只会"感染"你
使用泛型,只要你想要你正在谈论的类型
是通用的.一旦你到了你就知道你是哪种真实类型的阶段了
想用,可以自己指定,不再做类型
通用的.基本上,如果你想要仿制药的好处,你必须
能够为类的用户提供一种指定
的方式键入要用于这些好处的参数,如果你这样做,你就不能这样做
没有类型参数.
嗨乔恩-

感谢您的快速答复.如果我没记错的话,因为Java使用
泛型以不破坏遗留 JVM 的方式,它基本上
替换"T"的所有实例;与编译时的实际类型,
并在运行时有效地保持类型安全(你会得到一个
如果您尝试放置 T 类型以外的其他内容,则类强制转换异常
例如,进入对象).我意识到 C# 泛型不是
以这种方式实施,这是情况的症结所在.基本上,
我想我要求的是不可能的:泛型的类型安全
被保留,不管指向对象的指针如何
使用过(这可能会在 C++ 中使用模板,因为 n 个类
生成,每个使用的类型 T 变体一个).是否
底层对象在创建后保留类型信息,或者
是否总是由声明的语法处理(例如
List语法说<String>,不是因为List对象保留了String
内部)?

再次感谢!
罗伯特


本文地址:https://www.itbaoku.cn/post/1050405.html

相关标签/搜索