- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
2011 年 1 月 6 日更新:
信不信由你,我继续把这个界面合并到an open source library I've started, Tao.NET .我wrote a blog post解释这个图书馆的 IArray<T>
界面,它不仅解决了我最初在这个问题中提出的问题(一年前?!),而且还提供了 协变索引接口(interface) ,BCL 中非常缺乏(在我看来)的东西。
问题(简而言之):
我问为什么 .NET 有 IList<T>
,它实现了 ICollection<T>
因此提供了修改列表的方法( Add
、 Remove
等),但不提供任何中间接口(interface),例如 IArray<T>
通过索引提供随机访问,无需任何列表修改。
编辑 2010 年 1 月 21 日美国东部时间下午 2:22:
在对 Jon Skeet 的原始回答的评论中(他质疑人们多久需要一份诸如 IArray<T>
之类的契约(Contract)),我提到了 Keys
和 Values
SortedList<TKey, TValues>
的属性类是IList<TKey>
和 IList<Value>
,分别,乔恩回答说:
But in this case it's declared to be IList and you know to just use the indexers. . . . It's not hugely elegant, I agree - but it doesn't actually cause me any pain.
SortedList<TKey, TValue>
的经验类(class)。
SortedList<string, int> mySortedList = new SortedList<string, int>();
// ...
IList<string> keys = mySortedList.Keys;
keys.Add("newkey");
IList<string>
,这是合法的.但是我们都知道,它会导致异常。
Well, the interfaces aren't perfect but a dev can check the IsReadOnly property before calling Add/Remove/Set...
public interface ICanWalkAndRun {
bool IsCapableOfRunning { get; }
void Walk();
void Run();
}
Walk
方法;在很多情况下,我会选择设置
IsCapableOfRunning
至
false
并抛出
NotSupportedException
在
Run
...
var walkerRunners = new Dictionary<string, ICanWalkAndRun>();
// ...
ICanWalkAndRun walkerRunner = walkerRunners["somekey"];
if (walkerRunner.IsCapableOfRunning) {
walkerRunner.Run();
} else {
walkerRunner.Walk();
}
ICanWalkAndRun
的接口(interface)的目的? ?
IList<T>
.
IList<T>
的一些实现。明确定义方法
Add
,
Insert
等 - 通常通过执行以下操作:
private List<T> _items;
public IList<T> Items {
get { return _items.AsReadOnly(); }
}
IList<T>
的属性, 和
接口(interface)的整个想法是:“这些是一些可用的属性和方法” ,我为什么要扔
NotSupportedException
(或无论如何)当他/她试图做一些根据界面应该完全合法的事情时?
IArray<T>
的东西通过索引提供非常基本的随机访问的接口(interface),但没有添加/删除,如下所示:
public interface IArray<T> {
int Length { get; }
T this[int index] { get; }
}
IList<T>
可以实现
ICollection<T>
和
IArray<T>
并添加其
IndexOf
,
Insert
和
RemoveAt
方法。
IList<T>
并吐出一个
IArray<T>
,但是......真的吗?)
System.Collections.Generic
中的接口(interface)?是这样设计的?我错过了什么吗?是否有一个令人信服的论点反对我所说的关于明确定义 IList<T>
成员的方法的问题? ?
最佳答案
设计问题并不总是非黑即白的。
一方面是针对每种情况的精确接口(interface),这使得实际实现接口(interface)的整个过程变得非常痛苦。
另一个是少数(er)多用途接口(interface),它们并不总是完全被实现者支持,但使许多事情变得更容易,例如传递相似但不会获得“精确接口(interface)”设计中分配的相同接口(interface)的实例.
所以BCL设计师选择了第二种方式。有时我也希望接口(interface)少一点多用途,特别是对于集合和 C#4 接口(interface)协/逆变特性(不能应用于大多数集合接口(interface),除了 IEnumerable<>,因为它们包含两个协以及逆变部分)。
此外,令人遗憾的是,诸如字符串和原始类型之类的基类不支持某些接口(interface),例如 ICharStream(对于字符串,可用于正则表达式等以允许使用除 string
实例之外的其他来源进行模式匹配)或 IArithmetic 用于数字基元,以便通用数学成为可能。但我想所有框架都有一些弱点。
关于.net - 为什么.NET 中没有 IArray(T) 接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2110440/
编写一个仅用于集中其他接口(interface)的接口(interface)是好的做法还是坏的做法? interface InterfaceA : InterfaceB, InterfaceC { }
有没有一种方法可以确定具体类型从任意接口(interface)列表?我知道类型转换,但我想知道所有满意的接口(interface)。 例如,给定: type Mover interface { Mo
我正在尝试制作斐波那契堆。 (在我正在上的算法课中多次提到它们,我想检查一下。)我希望堆使用任何类型的节点,所以我定义了一个 Node 接口(interface): package node type
这是我的代码: type IA interface { FB() IB } type IB interface { Bar() string } type A struct {
示例 A: // pseudo code interface IFoo { void bar(); } class FooPlatformA : IFoo { void bar() {
合并它编译的 leppies 反馈 - 但 IMO 有一些缺点,我希望编译器强制每个子类定义它们自己的 Uri 属性。现在的代码: [] type UriUserControl() = inh
我正在构建一个项目,该项目从用户那里获取一个术语,然后执行谷歌搜索并返回一个 json 格式的标题列表。 我正在使用 serpwow API 来执行谷歌搜索并试图解析响应。 但是我收到的错误是: pa
我只想在其他接口(interface)中实现某些接口(interface),我不希望它们能够被类直接继承。 提前致谢! 最佳答案 您不能在 C# 中执行此操作 - 任何类都可以实现它有权访问的任何接口
我是 Go 的新手,还有一些我还没有掌握的技巧 例如,我有一个可以这样调用的函数: myVar.InitOperation("foo",Operator.EQUAL,"bar") myVar.Init
我有一个通用接口(interface)来描述对输出流的访问,如下所示: interface IOutput { function writeInteger(aValue:Int):Void;
我正在做一个项目,我想通过某种接口(interface)(最好是 USB)将光电探测器电路安装到计算机上。但是,由于我是新手,所以我不知道应该朝哪个方向处理这个问题。假设我有一个带有 USB 连接的光
背景 我正在尝试创建一个简单的应用程序,以真正理解DDD + TDD + etc的整个堆栈。我的目标是在运行时动态注入DAL存储库类。这让我 域和应用程序服务层可测试。我打算用“穷人的DI”来完成 现
在 Java 中,接口(interface)扩展接口(interface)是完全合法的。 UML 中的这种关系看起来像“扩展”关系(实线、闭合、未填充的箭头)还是“实现”关系(虚线、闭合、未填充的箭头
我想创建一个具有相等和比较函数默认实现的接口(interface)。 如果我从类型 IKeyable 中删除所有内容除了Key成员,只要我不添加默认实现,它就是一个有效的接口(interface)。从
COM 中的双接口(interface)是能够通过 DispInterface 或 VTable 方法访问的接口(interface)。 现在有人可以告诉我这两种方法之间到底有什么区别吗? 我认为 V
我有一个类方法,它返回一个可以迭代的员工列表。返回列表的最佳方式是什么?通常我只返回一个 ArrayList。然而,据我了解,界面更适合这种类型的操作。哪个是最好使用的界面?另外,为什么返回接口(in
我想从包装类外部实例化一个内部非静态接口(interface)。 这可能吗? 考虑以下代码: shared class AOuterClass() { Integer val = 3; shared
我为一个类编写了一个接口(interface),如下所示: public interface IGenericMultipleRepository { Lazy> addresses { ge
我是 UML 的初学者,现在我正在创建一个序列图,问题是我想根据用户输入实现 DAO 接口(interface)。如何在时序图中正确绘制以实现接口(interface)。 最佳答案 您不会在 SD 上
要使用 jsr 303 验证创建有条件验证的组,请将接口(interface)类传递给注释,如下所示: @NotEmpty (groups={UpdateValue.class}) 我有很多不同的接口
我是一名优秀的程序员,十分优秀!