Tag: oop

C#中的接口inheritance

我正试图在写我的应用程序时遇到的问题(我)问题。 请看这个(我会尽量缩短代码): 我有一个名为IRepository根接口。 接下来, IBookRepository : IRepository接下来,实现它的具体类: BookRepository : IBookRepository 在RepositoryManager类中,我声明了private IRepository currentRepo; IRepoItem是由Book类实现的接口。 现在,当我尝试做这样的事情时: currentRepo = new BookRepository(); VisualStudio提供错误消息: 无法将类型’BookRepository’隐式转换为’IRepository’。 存在显式转换(您是否错过了演员?) 我尝试显式转换,但抛出了运行时exception…… 我知道(几乎可以肯定)它是一种叫做协方差的东西,这可能(可能)在.Net 4.0中解决了。 不幸的是我正在使用框架版本3.5编写,我无法改变它。 请给我一些建议 – 如何超支这个问题? 我想从RepoFactory获得currentRepo,它会产生几种存储库,具体取决于用户的需求。 我不知道这里是否允许链接,但是我在http://olgatherer.wordpress.com/上写了一些博客,我描述了应用程序创建。 我的英语不好,但我希望能理解我。 提前谢谢你的回答。 最好的问候,skrzeczowas

字符串与字节数组,性能

(这篇文章是关于高频类型编程) 我最近在一个论坛上看到(我认为他们正在讨论Java),如果你必须解析很多字符串数据,最好使用字节数组而不是带split()的字符串。 确切的post是: 使用任何语言,C ++,Java,C#的一个性能技巧是避免对象创建。 这不是分配或GC的成本,而是访问不适合CPU缓存的大型内存arrays的成本。 现代CPU比它们的内存快得多。 对于每次缓存未命中,它们会停止许多周期。 大多数CPU转置预算都是通过大缓存和大量滴答来分配的。 GPU通过准备执行大量线程来隐藏内存访问延迟并且几乎没有缓存并将晶体管花费在更多内核上,从而以不同方式解决问题。 因此,例如,不是使用String和split来解析消息,而是使用可以就地更新的字节数组。 您真的希望避免对大型数据结构进行随机内存访问,至少在内部循环中是这样。 他只是说“不要使用字符串,因为它们是一个对象并且创建对象是昂贵的”? 还是他说了别的什么? 使用字节数组是否确保数据尽可能长时间保留在缓存中? 当你使用一个字符串是否太大而无法保存在CPU缓存中? 一般来说,使用原始数据类型是编写更快代码的最佳方法吗?

Javascript“var obj = new Object”在C#中等效

有没有一种简单的方法来创建和使用C#设置属性,就像在Javascript中一样。 示例Javascript: var obj = new Object; obj.value = 123476; obj.description = “this is my new object”; obj.mode = 1;

需要有关OOP理念的建议

我正试图在C#中开启一个大型项目。 我之前的经验是在Delphi中,默认情况下,每个表单都是在应用程序启动时创建的,并且表示在(gasp)全局变量中保存的引用。 因此,我正在努力使我的思维适应100%面向对象的环境,而我的头脑正在旋转一点点。 我的应用程序将有大量的类集合这些类中的大多数只需要一个实例。 所以我在想:静态类。 我不太确定为什么,但我在这里读到的大部分内容都表明,如果我的class级要持有一个状态,我将其视为任何属性值,我应该使用单例结构。 好的。 但是有些人因为逃避我的理由而认为单身人士也是邪恶的。 除了这个程序之外,这些类都没有被用在任何地方的危险。 所以它们当然可以作为常规对象(与单例或静态类)一起工作 然后是对象之间的交互问题。 我很想创建一个充满公共静态属性的Global类,引用许多这些类的单个实例。 我还考虑过制作MainForm的属性(静态或实例,不确定哪个)。 然后我会让每个class级都知道MainForm作为所有者。 然后各种对象可以作为所有者互相引用。 对象1 ,所有者。 对象2等 我担心我的电子墨水耗尽了,或者至少让任何一个人的耐心都受到了这么长时间的困扰。 我希望我已经清楚地解释了我完全混乱的状态。 我只是在寻找一些关于我的最佳实践的建议。 所有输入都受到欢迎和赞赏。 在此先感谢David Jennings

C#:public new string ToString()VS public override string ToString()

我想在我的一个类中重新定义ToString()函数。 我写 public string ToString() ……而且工作正常。 但ReSharper告诉我要改变它 public new string ToString() 要么 public override string ToString() 有什么不同? 为什么C#需要这样的东西?

我担心我添加了太多接口

我正在构建我的域模型并继续重构它。 像我一样,我发现我喜欢接口,因为它允许我根据接口为具体类型创建可重用的方法/控制器/视图。 但是,我发现每次向其中一个域实体添加新属性时都会创建一个接口。 例如,我有一个MemberStatus对象,它inheritance自一个抽象的Entity对象,该对象又实现了IIdentifiableEntity接口,这意味着它具有Id属性。 MemberStatus还实现了INamedEntity接口,这意味着它具有Name属性, IOrderedEntity接口意味着它具有DisplayOrder属性, IHasMembers接口意味着它具有集合成员对象。 这是代码: public class MemberStatus : Entity, INamedEntity, IOrderedEntity, IHasMembers { public string Name { get; set; } public float DisplayOrder { get; set; } public ICollection Members { get; set; } } public abstract class Entity : IIdentifiableEntity { public int Id { get; set; } } public […]

创建公用事业类?

我是OOP的新手,我正在尽最大努力保持严格基于类的东西,同时使用良好的编码原则。 我现在是一个很好的方式进入我的项目,我有很多一般使用方法,我想放入实用程序类。 有没有最好的方法来创建实用程序类? public class Utilities { int test; public Utilities() { } public int sum(int number1, int number2) { test = number1 + number2; } return test; } 创建此Utilities类后,我是否只创建一个Utilities对象,并运行我选择的方法? 我有这个公用事业课程的想法是否正确?

工厂方法返回null是否可以?

我想知道这里的最佳做法。 如果工厂方法无法创建任何内容,返回null是一种好习惯吗? 这是一个例子: ICommand command = CommandFactory.CreateCommand(args); if (command != null) command.Execute(); else // do something else if there is no command 我想,另一种方法是返回NullCommand或其他东西,但最佳做法是什么?

在构造函数中实例化对象

执行以下操作有什么好处: public class Foo { private Bar bar; public Foo() { bar = new Bar(); } } 而不是像这样做: public class Foo { private Bar bar = new Bar(); public Foo() { } } 鉴于在实例化时,任何一个示例中的私有成员变量都将被实例化,我不相信存在差异,但我已经看到它足够多次到我好奇的地方。

通用方法可以使用逆变/协变类型吗?

我正在编写一个通用的方法,在T4模板的特殊任务中使用它。 该方法应该允许我使用通用接口中的专用类型。 我想到了以下签名: interface IGreatInterface { Object aMethodAlpha(U parameter) where U : IAnInterface; Object aMethodBeta(IAnInterface parameter) } public class AnInterestingClass : IAnInterface{} 当我尝试实现IGreatInterface ,编译器为aMethodBeta()标记了一个错误,因为我已经让我的T4使用IAnInterface的子类型来编写该方法(即我想实现这样的方法: Object aMethodBeta(AnInterestingClass parameter) )。 方法aMethodAlpha()可以使用,但不是我想要的干净,因为我的T4必须生成一些额外的代码。 我(也许错误地)提出必须由T4完成该方法的实现 Object aMethodAlpha(AnInterestingClass parameter) 。 我认为generics方法不支持逆变类型,但我不确定; 我想这是编译器阻止编码器使用具有未在通用类型中定义的方法的特定类型的方式… 通用方法在实现时是否必须使用确切类型? 有什么技巧可以改变这种行为吗?