Tag: oop

如何比较具有相似属性的两个截然不同的对象

这完全在C#中,使用.NET 2.0。 我有两个对象列表。 它们不是相关对象,但它们确实具有可以比较的某些共同点,例如基于Guid的唯一标识符。 这两个列表需要由另一个列表过滤,该列表只包含Guid,它可能与前两个列表中包含的ID匹配,也可能不匹配。 我已经想过将每个对象列表转换为’对象’并按此排序的想法,但是我不确定一旦它被转换我将能够访问ID属性,并且我在想这个方法在知道要排序的列表是什么时,对两个列表进行排序应该有些愚蠢。 引入每个对象列表的最佳方法是什么,以便可以仅使用ID来对列表进行排序?

有没有办法让构造函数只对C#中的父类可见?

我有一个inheritance自我创建的抽象类的类的集合。 我想使用抽象类作为工厂来创建抽象类的具体实现的实例。 有没有办法隐藏除父类之外的所有代码的构造函数。 我想基本上这样做 public abstract class AbstractClass { public static AbstractClass MakeAbstractClass(string args) { if (args == “a”) return new ConcreteClassA(); if (args == “b”) return new ConcreteClassB(); } } public class ConcreteClassA : AbstractClass { } public class ConcreteClassB : AbstractClass { } 但我想阻止任何人直接实例化2个具体的类。 我想确保只有MakeAbstractClass()方法可以实例化基类。 有没有办法做到这一点? UPDATE 我不需要从Abstract类外部访问ConcreteClassA或B的任何特定方法。 我只需要Abstract类提供的公共方法。 我真的不需要阻止Concrete类被实例化,我只是试图避免它,因为它们不提供新的公共接口,只是抽象类内部的一些非常具体的事物的不同实现。 对我来说,最简单的解决方案是将子类作为samjudson提到 。 我想避免这种情况,因为它会使我的抽象类’文件比我想要的要大很多。 […]

没有多重inheritance且没有代码重复的多重inheritance

我有一个关于如何在不允许多重inheritance的语言中处理以下场景的理论问题。 想象一下,我有一个基类Foo ,从中我希望创建三个子类: Class BarinheritanceFoo并实现function“A” Baz类inheritanceFoo并实现function“B” 类QuxinheritanceFoo并实现function“A”和“B” 想象一下,实现function“A”和“B”的代码总是相同的。 有没有办法只为“A”和“B”编写一次代码,然后将相应的类应用(或“inheritance”)它?

将我的类转换为Int64,Double等

相关问题: 不使用点运算符访问Class属性 我创建了一个名为MyDouble的类,如下所示 class MyDouble { double value; //overloaded operators and methods } 我可以在MyDouble上进行各种操作。 例子: MyDouble a = 5.0; a += 3.0; …etc 但是,这仍然会引发错误 MyDouble a = 5.0; long b = (Int64)a; //error long b = (int64)a.value; //works 如何定义它以使像(Int64)a这样的操作自动转换为(Int64)a.value ? 我不希望用户永远不必担心value属性的存在。

在引用父对象字段,属性或方法时,’base’和’this’之间有什么区别吗?

请考虑以下代码: public class Vehicle { public void StartEngine() { // Code here. } } public class CityBus : Vehicle { public void MoveToLocation(Location location) { ////base.StartEngine(); this.StartEngine(); // Do other stuff to drive the bus to the new location. } } 这个this.StartEngine(); 和base.StartEngine(); ,除了在第二种情况下, StartEngine方法无法在CityBus类中移动或覆盖? 是否会对性能产生影响?

有没有办法将对公共方法的访问限制为仅限于C#中的特定类?

我在C#中有一个带有公共方法的A类。 我想允许只有B类访问此方法。这可能吗? 更新 : 这就是我想做的事情: public class Category { public int NumberOfInactiveProducts {get;} public IList Products {get;set;} public void ProcessInactiveProduct() { // do things… NumberOfInactiveProducts++; } } public class Product { public bool Inactive {get;} public Category Category {get;set;} public void SetInactive() { this.Inactive= true; Category.ProcessInactiveProduct(); } } 我希望其他程序员这样做: var prod = Repository.Get(id); prod.SetInactive(); 我想确保他们不会手动调用ProcessInactiveProduct: […]

为什么inheritance不按我认为应该工作的方式工作?

我有一些inheritance问题,因为我有一组相互关联的抽象类需要全部重写以创建客户端实现。 理想情况下,我想做类似以下的事情: abstract class Animal { public Leg GetLeg() {…} } abstract class Leg { } class Dog : Animal { public override DogLeg Leg() {…} } class DogLeg : Leg { } 这将允许任何使用Dog类的人自动获取DogLegs以及使用Animal类获取Legs的任何人。 问题是被覆盖的函数必须与基类具有相同的类型,因此不会编译。 我不明白为什么不应该这样,因为DogLeg可以隐式地施放到Leg。 我知道有很多方法可以解决这个问题,但我更好奇为什么这不可能/在C#中实现。 编辑 :我有点修改,因为我实际上在我的代码中使用属性而不是函数。 编辑 :我将其更改回函数,因为答案仅适用于那种情况(属性的set函数的value参数的协方差不应该起作用)。 对不起波动! 我意识到这使得许多答案看起来无关紧要。

C#通过添加属性扩展类

在C#中是否可以扩展类而不是仅添加函数而是添加属性。 例如:我有一个我依赖的标准DLL库,供应商不想修改它。 在整个代码中我已经广泛使用了DataCell类,现在才意识到我需要为它添加一个额外的属性,因为创建一个inheritance自这个类的新扩展类看起来不会起作用+大量的重写。 DataCell [元数据] public class DataCell : Message { public int Field1; public int Field2; public DataCell() { .. } .. } 基本上我想添加一个public int Flags; 到这堂课。 所以我现在可以做而不重写任何东西,(新的DataCell).Flags = 0x10;

Linq SUM对象?

我有一个代表商业数据的对象。 基本上,它是一个聚集一些总数的对象: public class MyClass{ public double MyDataOne {get;set;} public double MyDataTwo {get;set;} public double MyDataThree {get;set;} public static MyClass operator +(MyClass data1, MyClass data2){ return new MyClass{MyDataOne = data1.MyDataOne + data2.MyDataOne, MyDataTwo=data1.MyDataTwo+data2.MyDataTwo, MyDataThree=data1.MyDataThree+data2.MyDataThree }; } } 现在,如果我有一个IEnumerable myClasses ,是否有一些我可以在MyClass中实现这一点:? myClasses.Sum(d=>d); 因为对我来说,添加对象的方式必须是对象的知识,而不是调用者的知识(如果有一天我有一个数据更多,我不想查看我的整个代码来查看它的使用位置) 。 谢谢

从同一个类中的另一个构造函数调用构造函数

我有一个带有两个构造函数的类(C#)。 这是代码片段: public class FooBar() { public FooBar(string s) { // constructor 1, some functionality } public FooBar(int i) : this(“My String”) { // constructor 2, some other functionality } } 是的,我知道我可以使用上面提到的方法从另一个构建器调用一个构造函数。 但是在这种情况下,如果我调用构造函数2,构造函数1中的所有语句都将在执行构造函数2中的语句之前运行。 我想要的是在运行构造函数2中的所有语句之后,它将调用构造函数1。 在我的确切情况下,我正在进行用户身份validation。 构造函数1仅使用用户ID检索用户信息,但构造函数2使用电子邮件和密码进行用户身份validation。 如果用户在数据库中,它将获取用户ID,现在我希望构造函数1填充该类的所有属性。 如果您需要更多信息,请与我们联系。 如果您认为还有其他更好的方法,我很乐意听取您的建议。 更新1:我想知道为什么这样的事情没有实现: public FooBar(bool b) { // constructor 3, some more functionality this.FooBar(“My String”); // calling constructor […]