Tag: interface

在C#中是否有任何方法可以在派生类中强制执行运算符重载?

我需要定义一个接口,它必须强制执行某些运算符重载到实现它的类型。 似乎没有一种明显的方法可以做到这一点,因为运算符重载必须在类中使用静态方法完成。 有没有办法达到相同的效果(使用抽象类或其他任何东西)?

显式接口实现不能是虚拟的

为了记录,我已经看过这个连接项,但我真的不明白支持这个问题会是什么。 说我有以下代码: public interface IInterface { void Method(); } public class Base : IInterface { virtual void IInterface.Method() { throw new NotImplementedException(); } } 虚拟标识符有什么问题? 拥有虚拟修饰符可以override指示基类中有不同的实现。 我现在可以通过删除虚方法并创建如下的派生类来使其工作: public class Derived : IInterface { void IInterface.Method() { throw new NotImplementedException(); } } 但是这样我真的没有迹象表明我压倒了什么。 更新: 根据C#(部分:20.4.1显式接口成员实现)规范,有两个原因。 隐藏某些方法(我正在使用它)。 具有相同签名但具有不同返回类型的2个函数(例如,对IClonable有用)。 它没有说明为什么你不能使这些方法虚拟。 UPDATE2: 鉴于答案,我认为我应该在这里重新提出真正的问题。 如果以上两个原因是首先使接口的显式实现成为可能的原因。 如果将方法设为虚拟,为什么会出现问题?

MVC模式差异

我只需要一些链接到我可以阅读的文章或关于MVC(C#)中使用的不同模式的一些基本解释。 目前,我倾向于使用视图模型模式构建我的Web应用程序。 对于每个视图,我都有一个视图模型。 我喜欢这种方法纯粹是因为模型中不需要那么多垃圾,我可以在这里使用一些基本的数据注释。 我现在也在视图模型中构建我的视图模型(不确定这是否正确?)这样我就可以让控制器尽可能简单。 有时候我发现自己在我的控制器中添加了很多逻辑,我认为这对我来说也很好,这就是控制器的用途。 现在根据上述内容,我说我可以很愉快地构建我的应用程序,没有任何重大问题。 然而,在我正常浏览代码示例等的同时,我经常发现有很多其他方法可供不同的开发人员用来完成我上面所做的基本操作,并且我想要解释它们都适合在一起。 我经常看到提到“使用你的存储库做等等”。我确实使用了“有时”的存储库,但这主要是为了模型查询,我知道我将来会重复使用它总是会变成一点点垃圾场。 这里的最佳做法是什么? 我也看到提到“接口”和“服务层”我在这里完全迷失了……大多数例子对我来说似乎只是添加了越来越多的步骤来实现相同的目标。 它们是如何使用的?

通用接口的通用列表是不允许的,任何替代方法?

我试图找到使用通用接口通用列表作为变量的正确方法。 这是一个例子。 它可能不是最好的,但希望你能明白这一点: public interface IPrimitive { T Value { get; } } 然后在另一个类中,我希望能够声明一个变量,该变量包含对任意T实现IPrimitive的对象列表。 // I know this line will not compile because I do not define T List<IPrimitive> primitives = new List<IPrimitives>; primitives.Add(new Star()); // Assuming Star implements IPrimitive primitives.Add(new Sun()); // Assuming Sun implements IPrimitive 请注意,对于列表中的每个条目, IPrimitive可能不同。 关于如何建立这种关系的任何想法? 替代方法?

如何处理TDD中的接口过度使用?

我注意到,当我在做TDD时,它经常导致非常大量的接口。 对于具有依赖项的类,它们以通常的方式通过构造函数注入: public class SomeClass { public SomeClass(IDependencyA first, IDependency second) { // … } } 结果是几乎每个类都将实现一个接口。 是的,代码将被解耦并且可以非常容易地进行单独测试,但是也会有额外的间接级别让我感到有点……不安。 有些事情感觉不对劲。 任何人都可以分享其他不涉及如此大量使用接口的方法吗? 你们其他人怎么样?

如何为表单控件创建模板函数?

此语句将更改表单对象的位置。 lblMessage.Location = new Point(0,0); 我想编写一个可以定位任何表单对象的通用模板函数 。 我想出了这个,但它无效: public void ChangePosition(T form_object) { form_object.Location = new Point(0,0); } 我称之为: ChangePosition(lblMessage); 错误:’T’不包含’Location’的定义,也没有扩展方法’Location’接受类型’T’的第一个参数(你是否缺少using指令或汇编引用?) 我是否需要在模板function上提及某种界面? 如何在generics类型上调用扩展方法?

处理与服务定位器模式一起使用时MongoDB如何存储DateTime

我的同事和我在辩论中处于僵局,其他人的意见将不胜感激。 我们利用服务定位器模式和通用接口来抽象我们的所有数据访问,以便随着需求的变化,我们可以轻松地在不同的数据源之间进行交换。 我们的调用代码没有指示数据的存储位置或方式。 它只是通过服务注册表提供的服务访问数据。 当我们在对象上有DateTime字段并将其存储到MongoDB数据源时,我们正在讨论的问题就出现了。 我注意到的是,当我们在C#中有一个带有DateTime的对象时,它显示为正确的时间。 当我们使用MongoVUE登录MongoDB服务器来检查对象时,它会显示正确的时间。 但是当我们检索对象时,DateTime现在是UTC。 当将内存中的DateTime与从MongoDB数据源检索到的对象中的DateTime进行比较时,这显然会产生问题。 我知道Mongo在内部将DateTime存储为UTC时间。 我甚至理解为什么在你打电话时它可能会返回UTC。 这是辩论开始的地方。 有人建议这只是一个美容问题,只是显示日期时的一个问题。 因此,我们应该简单地在界面层中调用.ToLocalTime。 我不同意并声称这危险地打破了我们在实现服务定位器模式时创建的抽象层。 它还提出了与那些日期时间的交互问题,因为它涉及触发其他事件。 我在其他地方读到的是,我们应该将我们的时间存储为字符串,特别是作为UTC格式的一些标准。 以这种方式,接口层不知道或不关心如何存储DateTime,也不知道我们的对象,因为每个数据源都以相同的方式存储该字符串。 我已经成功使用ISO 1806格式,但我的同事认为这是一个’hacky’修复,使用.toLocalTime是处理这种情况的适当方法。 我对其他人对这个话题的看法很感兴趣。 提前感谢您的意见。

.Net CLR如何在内部实现“接口”?

只是好奇.NET CLR如何在内部处理接口? Q1]当CLR遇到类似的情况时会发生什么: 简单的界面示例。 (以下同样使用。) interface ISampleInterface { void SampleMethod(); } class ImplementationClass : ISampleInterface { // Explicit interface member implementation: public void SampleMethod() { // Method implementation. } static void Main() { //Declare an interface instance. ISampleInterface mySampleIntobj = new ImplementationClass(); // (A) // Call the member. mySampleIntobj.SampleMethod(); // Declare an interface instance. ImplementationClass […]

IEnumerable 如何在后台运行

我正在徘徊IEnumerable接口的更深入的function。 基本上,它作为执行中的中间步骤。 例如,如果你写: IEnumerable temp = new int[]{1,2,3}.Select(x => 2*x); 在使用temp进行某些操作(例如List list = temp.ToList() )之前,不会计算(枚举) Select函数的结果。 但是,令我困惑的是,因为IEnumerable是一个接口,所以根据定义它不能被实例化。 那么,实际项目(在示例2*x项目中)所在的集合是什么? 而且,如果我们要编写IEnumerable temp = Enumerable.Repeat(1, 10); ,什么是存储1s的底层集合(数组,列表,其他)? 我似乎无法找到关于此接口及其function的实际实现的详尽(更深入)解释(例如,如果存在底层集合, yield关键字如何工作)。 基本上,我要求的是对IEnumerable的function进行更详细的解释。

为什么接口实现不能返回更具体的类型?

如果接口指定了返回另一个接口的属性或方法,为什么第一个接口的实现不允许将返回类型“更改”为更具体的类型? 我们举一个例子来说明: interface IFoo { IBar GetBar(); } interface IBar { } class Foo : IFoo { // This is illegal, we are not implementing IFoo properly public Bar GetBar() { return new Bar(); } } class Bar : IBar { } 我知道如何让它发挥作用,这不是我关心的问题。 我可以: 将GetFoo()返回类型更改为IBar ,或 显式实现接口,只需从IFoo.GetBar()方法调用GetBar 我真正要问的是不仅允许上面的代码编译的原因。 有没有上述情况不符合IFoo规定的合同。