Tag: oop

NHibernate:一个基类,几个映射

我对NHibernate比较陌生,但是我已经将它用于最后几个程序并且我很喜欢。 我遇到了需要将4-5个数据库中的数据聚合到一个数据库中的情况。 具体来说,它是序列号数据。 每个数据库都有自己的映射文件,但最终实体都共享相同的基本结构(Serial类)。 我理解NHibernate希望每个类都有一个映射,所以我最初的想法是拥有一个基本的Serial Class,然后为每个不同的数据库inheritance它,并创建一个唯一的映射文件(inheritance的类将没有内容)。 这应该非常适合抓取所有数据并填充对象。 我想要做的是使用基类映射将这些inheritance的类(不确定正确的术语是什么)保存到基类表中。 问题是我不知道如何强制NHIbernate为对象使用特定的映射文件。 使用’session.save()’时,将inheritance的类转换为基类没有任何作用(它抱怨没有映射)。 有没有办法明确指定使用哪个映射? 或者是否只有一些OOP主体我缺少更具体地将inheritance的类转换为基类? 或者这个想法是不好的。 关于NHibernate(第8章)我可以找到的所有inheritance内容似乎都不完全适用于这个函数,但我可能是错的(每个具体类的表看起来可能有用,但我可以’关于NHibernate如何计算出去做的事情,我完全绕过它。

如何在C#中创建子类?

如何使用Visual Studio 2010在C#for ASP.NET中创建子类?

一般来说,每个抽象函数在C#中都是虚拟的吗?

我在看Stack Overflow问题抽象函数和虚函数有什么区别? ,我想知道每个抽象函数是否应该被认为是C#中的虚函数或者一般? 我对“你必须覆盖/你可以覆盖”对这个问题的回答感到有些困惑。 不是C#程序员,我倾向于认为抽象函数只是一个编译时的概念,抽象函数是定义的虚函数,因为你必须提供至少一个,但可以在层次结构的下面提供多个实现。 虚函数也有编译时维度,因为你不能覆盖非虚函数,但它们主要是运行时概念,因为它“只是”选择基于实际接收器的正确方法实现。

有没有办法让一个类“删除”它inheritance的方法?

有没有办法让一个类“删除”它inheritance的方法? 例如,如果我不希望我的类有一个ToString()方法,我可以做一些事情,使它不再可用吗?

我怎样才能更好地设计这个? (避免使用面向对象设计的switch语句)

我对面向对象的设计有点了解,但我不确定如何在我的代码中使用这些原则。 这是我正在做的事情: public void Query(Agency agency, Citation queryCitation) { queryCitation.AgencyCode = agency.AgencyCode; switch (agency.ClientDb.Type) { case “SQL”: QueryOracle(agency, queryCitation); break; case “PIC”: QueryPick(agency, queryCitation); break; } } (其中大部分是来自NHibernate的对象。我正在使用遗留数据库系统并将其部分重构到代码库中。)显然,我可以在这里做一些不同的事情,这样我就不需要为不同的数据库提供重复的function了。具有相同输入的查询。 它应该根据代理对象知道是使用Oracle数据库还是选择数据库连接。 (如果你从未听说过Pick数据库,那么直到我开始在这里工作之前我都没有。我们通过HTTP请求对它进行查询,所以它不是SQL。) 我应该创建一个接口,例如名为“ClientDbConnection”,然后创建两个实现该接口的类,移动代码查询数据库,然后使用“agency.clientDb.Query(queryCitation)”替换整个函数? 我想我在这里大声思考,但对此的任何意见都将不胜感激。

接口是否与多态性兼容

我遇到了与多态类型(甚至多态接口)交互的接口概念的问题。 我正在开发C#,并希望能够接近这个定义的答案,尽管我认为这仍然为每个人提供了足够的空间来提出答案。 举个例子,假设你想制作一个绘制东西的程序。 您为Paints定义了一个接口,并为绘制的主题定义了一个接口。此外,您还有一些可以更具体的方式绘制的主题。 interface IPainter { void paint(IPaintable paintable); } interface IPaintable { void ApplyBaseLayer(Color c); } interface IDecalPaintable : IPaintable { void ApplyDecal(HatchBrush b); } 我可以想象制作一个类似于以下的画家: class AwesomeDecalPainter : IPainter { public void paint(IPaintable paintable) { IDecalPaintable decalPaintable = (IDecalPaintable)paintable; decalPaintable.ApplyBaseLayer(Color.Red); decalPaintable.ApplyDecal(new HatchBrush(HatchStyle.Plaid, Color.Green)); } } 当然,如果paintable没有实现IDecalPaintable,这将抛出。 它立即引入了IPainter实现与其操作的IPaintable之间的耦合。 但是我也认为说AwesomeDecalPainter不是IPainter是不合理的,因为它的使用仅限于IPaintable域的一个子集。 所以我的问题实际上是四方面的: 接口是否与多态性兼容? 实现可以在IDecalPaintable上运行的IPainter是一个好的设计吗? 如果它可以专门在IDecalPaintable上运行呢? […]

如何防止C#中的inheritance者调用基础构造函数?

我有一个(写得很差)基类,我想包装在一个代理对象中。 基类类似于以下内容: public class BaseClass : SomeOtherBase { public BaseClass() {} public BaseClass(int someValue) {} //…more code, not important here } 而且,我的代理类似于: public BaseClassProxy : BaseClass { public BaseClassProxy(bool fakeOut){} } 如果没有“fakeOut”构造函数,则应该调用基础构造函数。 然而,有了它,我预计它不会被调用。 无论哪种方式,我要么需要一种方法来不调用任何基类构造函数,或者有其他方式来有效地代理这个(邪恶的)类。

装饰模式实现

尝试使用“Head First Design Patterns”一书(用Java编写)中的代码在C#中实现装饰器模式。 我刚刚开始使用C#,因此我仍然对语法不熟悉,所以我不确定为什么我不能让下面的注释代码行工作。 这是Decorator模式中的第一个抽象基类及其派生类: using System; public abstract class Beverage { private String m_description; // get a description of the beverage public virtual String Description { get { return m_description; } } // calculate cost of the beverage public abstract double Cost(); } // HouseBlend coffee implements Beverage public class HouseBlend : Beverage […]

成员变量和成员属性之间的区别?

在某些情况下,我在我的类顶部声明成员变量,然后声明一个属性来访问或设置该成员变量,但我问自己,如果该变量只是从内部访问和设置,那么该属性是否必要这个类而不是其他,所以使用属性访问和设置成员变量的优点是什么,而不是直接对成员变量本身进行操作。 这是一个例子: public class Car { int speed; //Is this sufficient enough if Car will only set and get it. public Car(int initialSpeed) { speed = initialSpeed; } //Is this actually necessary, is it only for setting and getting the member //variable or does it add some benefit to it, such as caching and if […]

如何重载是编译时间和覆盖是运行时?

乡亲 我遇到了许多用于理解多态性的线程(编译时和运行时)。 我很惊讶地看到一些程序员声称重载是Runtime而Overriding是编译时间的链接。 我想从这里知道的是: 运行时多态性与REAL TIME示例和小代码以及我们应该使用的场景。 编译时间多态性与REAL TIME示例和小代码以及何时使用。 因为我阅读了许多理论定义,但我对理解这一定义并不满意。 另外,我想一想,我也觉得,重载应该是运行时因为,因为我有一个计算Area的方法,在运行时只根据我传递的参数决定调用哪个重载方法(如果我只通过则说一个参数,它应该触发Square,如果参数是2,它应该触发Rectangle)….所以不是它我可以声称它的运行时? 它的编译时间如何? (大多数人说理论上,重载是编译时间,但他们甚至没有给出一个正确的实时例子……很少有人声称它的运行时间)…. 另外,我觉得压倒一切是编译时间,因为在编写代码和编译时,确保使用虚拟关键字并在派生类中覆盖该方法,否则会给出编译时错误。 所以我感觉它的编译时间,就像我在一个线程中看到的那样…..但大多数线程声称它的运行时:D 我很困惑:(这个问题是我的问题1和2的补充。请帮助一个实时的例子..因为我已经知道理论定义…. 🙁 谢谢….