Tag: oop

C#接口的方法的默认实现?

是否可以在C#中定义具有默认实现的接口? (这样我们就可以定义一个实现该接口的类,而无需实现该特定的默认方法)。 我知道扩展方法 (例如在此链接中解释)。 但这不是我的答案,因为有一个方法扩展如下,编译器仍然抱怨在MyClass中实现MyMethod: public interface IMyInterface { string MyMethod(); } public static class IMyInterfaceExtens { public static string MyMethod(this IMyInterface someObj) { return “Default method!”; } } public class MyClass: IMyInterface { // I want to have a default implementation of “MyMethod” // so that I can skip implementing it here } 我问这个是因为(至少就我所理解的而言)可以在Java中这样做(见这里 […]

如何在generics集合上创建扩展方法

我有一个包含FrameworkElements的列表,我想创建一个名为MoveToTop的扩展方法。 所有这一切都将接受属于该列表的项目并将其移动到列表的开头。 我知道这可以在不使用扩展方法的情况下完成,但我希望它可以作为扩展方法实现。 我无法弄清楚创建接受generics参数的扩展方法的语法。 我知道这不正确,但如果有人能告诉我如何实现这一目标,我将不胜感激。 public static class Extensions { public static void MoveToTop(this ICollection sequence) { //logic for moving the item goes here. } }

在C#中实现DDD实体类

我现在开始使用DDD,我已经找到了一个很好的ValueObject实现,但我似乎找不到任何好的实体实现,我想要一个通用的基本实体类型,它将具有一个ID(规范需要)和实现当前的平等操作。 什么是最优雅的解决方案?

何时进行子类而不是区分行为

我难以决定何时应该进行子类化而不是仅添加表示类的不同模式的实例变量,然后让类的方法根据所选模式进行操作。 例如,假设我有一个基础车类。 在我的计划中,我会处理三种不同类型的汽车。 赛车 , 公共汽车和家庭模型 。 每个都有自己的齿轮实现,它们如何转动和座椅设置。 我是否应该将我的汽车子类化为三种不同的型号,或者我应该创建一个类型变量并使齿轮,车削和座椅通用,以便它们根据所选择的车型而有所不同? 在我目前的情况下,我正在开发一款游戏,并且我已经意识到它开始变得有点混乱,所以我会询问有关可能重构我当前代码的建议。 基本上有不同的地图,每个地图可以是三种模式之一。 根据地图定义的模式,将会有不同的行为,地图将以不同的方式构建。 在一种模式中,我可能必须在超时的基础上向玩家发放租金并产生生物,其中另一个玩家负责产生生物,而在另一个模式中可能存在一些自动生成的生物以及玩家衍生的生物和建造建筑物的玩家。 所以我想知道是否最好有一个基本地图类,然后将其子类化为每个不同的模式,或者是否继续沿着我当前添加差异化行为的路径,具体取决于地图类型变量设置为。

如何在链表中找到中间元素

我需要一个详细的算法,在c#中关于如何在链表中找到中间元素。 我检查了谷歌,所有人都在谈论在列表上并行移动的两个指针。 但实际上,我找不到算法的详细解决方案。 以及如何实施这两个指针。 我需要有关性能的最佳解决方案。

什么应该在一个有助于某人开发优秀的OO软件的清单上?

几年前我使用过OO编程语言和技术(主要是在C ++上),但是在这段时间内,OO没有做太多。 我开始在C#中创建一个小实用程序。 我可以简单地编写它而不使用良好的OO练习,但对我来说应用OO技术将是一个很好的复习。 就像数据库规范化水平一样,我正在寻找一个清单,它会让我想起一个“好的”面向对象程序的各种经验法则 – 一个简明的是/否列表,我可以在设计和实现过程中偶尔阅读以防止我从思考和程序上的工作。 如果它包含适当的OO术语和概念将更加有用,以便任何检查项目都可以轻松搜索以获取更多信息。 什么应该在一个有助于某人开发优秀的OO软件的清单上? 相反,可以应用哪些’测试’来显示软件不是OO?

传递generics参数会导致调用错误的重载

我正在尝试更新Medusa以允许在目前使用List任何地方使用装饰的POCO。 我遇到的问题是调用了错误的重载。 这是我所看到的一个简单例子: void Run() { CallDoSomething(“Hello World”, new object()); CallDoSomething(“Hello World2”, new List()); } // `DoSomething` represents the functions that do the heavy lifting public T DoSomething(string someString, List ints) where T : class { Console.WriteLine(“List: {0}”, someString); return default(T); } public T DoSomething(string someString, object ints) where T : class { Console.WriteLine(“object: {0}”, […]

如何处理catch块中的exception?

我试图找到处理exception的理想方法。 我用Google搜索并读取我应该在catch块中放置try catch以处理但是如果嵌套块本身发生任何exception会怎样。 try { int a = 10; int b = 0; int c = a / b; Console.WriteLine(c); Console.ReadKey(); } catch (Exception ex) { int a = 10; int b = 0; int c = a / b; Console.WriteLine(ex.Message.ToString()); Console.ReadKey(); } finally { Console.WriteLine(“Some Exception”); } 在谷歌搜索我读到它应该装饰如下: 如果Catch块本身发生exception,那么如何在C#中处理它? 如果Catch块本身发生exception,那么如何在C#中处理它? 如果在C#中的Catch块中发生exception会发生什么。 在这种情况下,调用者结果也是如此 try { […]

一个安全地提供公共API(只读)和私有API(读写)的对象

这是一个架构问题。 程序员经常遇到这种封装问题,但我还没有看到一个完整而干净的解决方案。 相关问题: 当一个非只读类已经到位时,只读类设计 控制对字段的读/写访问 通常,在OOP范例中,对象将其数据存储在字段中。 该类自己的方法可以完全访问其字段。 当您需要返回值时,您只需返回数据的副本,以便外部代码不会破坏数据。 现在假设数据块很复杂,因此它们本身就封装在类对象中,并且这些对象不容易被复制。 现在,如果从某个属性返回此类对象,则外部代码对您的内部代码具有相同的访问权限。 例如,如果返回List ,则每个人都可以向其添加值。 这通常是不合需要的。 这个问题通常使用只读包装器 – 在返回之前将完全访问的内部对象包装在只读包装器中。 这种方法的问题是包装器可能是包装值的不良替换 – 包装器是一个不同的类。 (如果从可修改的类派生只读包装器(或反之亦然),那么任何人都可以将“只读”对象向上/向下转换为可修改对象,从而破坏保护。) 我想要一个模式: 数据(例如, int值)具有“public / read-only API”和“private / modifiable API”。 只有对象创建者才能访问“私有/可修改的API”。 私有/公共API可以具有被动部分(例如方法,属性)和活动部分(例如事件)。 除了在对象创建阶段,不应使用代理。 所有电话都应该是直接的。 从“公共/只读API”(以及最好来自“私有/可修改的API”)访问内部数据应该尽可能直接。 在编写这样的对象时,我不希望堆积大量的包装器。 以下是示例界面: interface IPublicApi { int GetValue(); } interface IPrivateApi { void SetValue(int value); } interface IPrivateConsumer { void OnValueChanged(); //Callback […]

将对象从表单传递给表单

我有一个相当大的CRUD winform应用程序,它设置为显示tabcontrols中嵌入的表单。 我想拥有Person的对象,(有)a Enrollment,(有a)计划在与表单交互时保存和跟踪信息。 我该如何做到这一点? 我发现了一个建议,在我的Program.cs中声明Person对象,就像这样 – > internal static class Program { public static CurrentPerson _CurrentPerson; /// /// The main entry point for the application. /// [STAThread] private static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new FrmWWCShell()); } } 然后在Search.cs上 – > Program._CurrentPerson = new CurrentPerson { PersonID = Convert.ToInt32(pID), LastName = lName, FirstName = […]