Tag: oop

使用什么样的数据结构?

我正在开展一个需要跟踪的项目: 5-6只是字符串名称的根项 每个根项都需要具有不同标识符类型的多个子项(int,string,float等)。 一个根的所有子节点都是相同类型,但每个根节点将具有不同的子类型 用户需要能够从每个根添加/删除子项 我稍后需要单独访问每个孩子,并在需要时执行字符串操作和解析 我想过可能会使用一个字典,其中Key是一个字符串,而Values是对象列表。 或者每个根项都有一个唯一的类,每个类都包含一个子列表。 有没有人有任何好的建议? 我对OOP还很新,请耐心等我:) 谢谢!

虚拟类中的抽象方法

我有一个具有许多虚方法的ac #Class,其中一些方法基本上是抽象的(它们完全在子类中实现,基类是空的)。 为了让它进行编译,我在基类中抛出一个InvalidOperationException,并对应该做什么做出评论。 这只是感觉很脏。 有没有更好的方法来设计我的课程? 编辑:对于将在加拿大运行的应用程序的中间层,一半的方法是通用的,因此是虚拟的。 一半的方法都是省特定的。 Public class PersonComponent() { public GetPersonById(Guid id) { //Code to get person – same for all provinces } Public virtual DeletePerson(Guid id) { //Common code } Public virtual UpdatePerson(Person p) { throw new InvalidOperation(“I wanna be abstract”); } Public Class ABPersonComponent : PersonComponent { public override DeletePerson(Guid id) […]

从抽象基类返回规范表示子类是否可以接受?

编辑2: TL; DR :有没有办法不打破OO最佳实践,同时仍然满足一系列相同类型的东西必须转换为类似规范的东西的约束? 此外,请记住,我的问题是关于一般情况,而不是具体的例子。 这不是一个家庭作业问题。 假设您有以下内容: 实现通用function的抽象基类; 一个具体的派生类,用作规范表示。 现在假设您希望基类的任何inheritance者可以转换为规范表示。 实现此目的的一种方法是在基类中使用一个抽象方法,该方法旨在将inheritance者的转换作为规范派生类的实例返回。 但是,似乎普遍认为基类不应该知道它们的任何派生类,并且在一般情况下,我同意。 但是,在这种情况下,这似乎是最好的解决方案,因为它允许任意数量的派生类,每个派生类都有自己的实现,我们不需要知道任何事情,通过转换为每个派生的规范表示可以互操作class必须实施。 你会以不同的方式做吗? 为什么以及如何? 几何点的示例: // an abstract point has no coordinate system information, so the values // of X and Y are meaningless public abstract class AbstractPoint { public int X; public int Y; public abstract ScreenPoint ToScreenPoint(); } // a point in […]

使用字符串值创建新实例

我有几个类:SomeClass1,SomeClass2。 如何使用字符串中的类名创建其中一个类的新实例? 通常,我会这样做: var someClass1 = new SomeClass1(); 如何从以下创建此实例: var className = “SomeClass1”; 我假设我应该使用Type.GetType()或其他东西,但我无法弄明白。 谢谢。

在c#中实现多态性,如何做到最好?

第一个问题在这里,所以希望你们都会轻轻地对我说话! 在过去的几天里,我一直在阅读关于多态的非常多的内容,并试图将它应用到我在c#中所做的事情,似乎有几种不同的方法来实现它。 我希望我已经掌握了这个,但即使我没有澄清,我也很高兴。 从我所看到的,我有3个选择: 我可以从基类inheritance并在我希望派生类重写的任何方法上使用关键字’ virtual ‘。 我可以用虚方法实现一个抽象类,并以这种方式实现, 我可以使用界面吗? 从我所看到的,如果我不需要基础中的任何实现逻辑,那么一个接口给了我最大的灵活性(因为我当然不限制我自己的多重inheritance等),但如果我需要基础为了能够在派生类正在做的事情之上做一些事情,那么使用1或2将是更好的解决方案? 感谢有关这些人的任何意见 – 本周末我已阅读了很多内容,无论是在本网站还是其他地方,我认为我现在理解这些方法,但我只是想以语言特定的方式澄清如果我在右边跟踪。 希望我也正确地标记了这一点。 干杯,特里

如何使用另一个程序集的内部类

我有一个第三方程序集,我想在我的新C#项目中使用它的Internal类。 可能吗? 真的很感激任何一个例子

OOP最佳实践:Employee.GetCars()vs Cars.GetByEmployee()

鉴于Company , Employee和Car类,检索与公司或员工相关联的汽车的方法的首选做法是什么? Employee.GetCars(params…) Company.GetCars(params…) 要么: Cars.GetByEmployee(params…) Cars.GetByCompany(params…) 第一种方法是我一直使用的方法,对我来说似乎总是最直观的。 但在看到使用第二种方法的大型代码库之后,我必须承认它正在增长。 我真正喜欢第二种方法的两件事是: 它将所有与Car相关的代码组合在一起成为一个文件,使代码更加模块化,更易于维护。 有一个直观的逻辑,让任何方法都将Car的返回值(或者更像是List )分组到Car类中。 有没有最佳实践涵盖这个?

抽象类不能用c#封装?

我在某处读到了 “抽象和密封修饰符相当于一个静态的类” 我也发现了 “当你声明一个静态类时,编译器在内部标记类抽象并密封,并在IL代码中创建一个私有构造函数” 所以,我决定这样做: static class A { public static void test() { Console.WriteLine(“test”); } } 现在,类“A”不能被inheritance或实例化。 因此,让我们使用abstract编写一个class B来防止实例化并使用sealed来防止inheritance。 但是,这种方法失败了。 这相当于 public abstract sealed class B { private B() { } public void test() { Console.WriteLine(“test”); } } But I recieve an error stating “error CS0418: B’:抽象类不能被密封或静态”。 任何想法为什么这是不可能的? 提前感谢您的回答。

常规类静态类静态方法instanve方法的内存分配和堆栈上的数据成员c#?

本书的大部分内容从未谈及程序如何执行以及如何在堆栈和堆上为它们分配内存。 当数据存储在堆栈上和堆上时。 假设我有一个常规课程 public class MyClass { int Age=0; string strName=”None” Double Salary=0; public void Data1() { Age=30; strName=”Robin”; Salary=3500; } } 题 1)所以对于上面的类将如何分配内存。 当程序运行时,将分配内存或当我们创建实例时,将分配内存。 当我们通过实例调用Data1() ,会发生什么以及如何分配内存。 内存将被分配用于函数调用或数据成员初始化? 告诉我将为age , name和salary分配多少内存。 内存将在堆栈或堆上分配。 public class MyClass { static int y=0; static string strComp=”None” int Age=0; string strName=”None” Double Salary=0; public void Data1() { Age=30; strName=”Robin”; Salary=3500; […]

在.NET中隐藏inheritance的通用接口成员:好,坏还是难看?

我知道类实现中的阴影成员可能导致“错误”成员可以被调用的情况,这取决于我如何构建我的实例,但是对于接口我没有看到这可能是一个问题,我发现自己编写接口像这样经常这样: public interface INode { IEnumerable Children { get; } } public interface INode : INode where N : INode { new IEnumerable Children { get; } } public interface IAlpha : INode { } public interface IBeta : INode { } 我的代码中有一些地方只知道INode所以孩子们也应该是INode类型。 在其他地方我想了解具体的类型 – 在我的示例IAlpha和IBeta接口的实现中,我希望子类型与其父类型相同。 所以我实现了一个NodeBase类: public abstract class NodeBase : INode where N […]