Tag: oop

从父类调用重写虚方法

假设您正在编写原始C# Object类,并且您需要以下function: object1 == object2将比较引用,除非重写此运算符 object1 != object2将始终返回对象的ACTUAL对象1 object1 == object2的反转 因此,例如,如果我有一个使用ear length作为其equals方法的Bunny类(派生自Object ),那么如果bunnies具有不同的ear长度,则notequals方法(inheritance自Object )应该返回true。 我看到的问题是,如果我写我的Object类,如下所示: public partial class Object { public virtual bool Equals(Object o2) { return (this === o2); } public bool NotEquals(Object o2) { return !this.Equals(o2); } } 那么看起来这个定义会将NotEquals绑定到Object的Equals,而不是实际派生类的equals。 有没有什么方法可以在不修改C#本身的情况下工作? 我并不在乎C#中的这种可能性,但我关心是否有一些OOP原则告诉我我不应该期望这种事情能起作用。 此外,我不确定这是否是这个问题的基础,但是想法是NotEquals也是虚拟的,所以它也可以被希望它们的o1 != o2不同的派生类所覆盖!(o1 == o2) 。 这个问题的灵感来自最近的讨论 。

了解c#中的基础

我正在尝试理解基础构造函数的实现。 考虑这种情况如果我有基类运动 public class Sport { public int Id { get; set; } public string Name { get; set; } public Sport() { Console.WriteLine(“Sport object is just created”); } public Sport(int id, string name) { Console.WriteLine(“Sport object with two params created”); } } 现在我有inheritanceSport类的篮球课,我想在篮球对象初始化中使用带有两个参数的第二个构造函数。 public class Basketball : Sport { public Basketball : base ( […]

Liskov替换原则,前提条件和抽象方法

Liskov替换原则(LSP)说: 子类型不能强化前提条件。 在C#中,我可能违反以下原则: public class A { public virtual void DoStuff(string text) { Contract.Requires(!string.IsNullOrEmpty(text)); } } public class B : A { public override void DoStuff(string text) { Contract.Requires(!string.IsNullOrEmpty(text) && text.Length > 10); } } 但是,如果A.DoStuff是一个abstract方法会发生什么: public class A { public abstract void DoStuff(string text); } public class B : A { public override void […]

为什么我们应该实现接口?

实现接口只提供方法的框架。 如果我们知道该方法的确切签名行,在这种情况下 实现接口的要求是什么? 这是实现接口的情况 interface IMy { void X(); } public class My:IMy { public void X() { Console.WriteLine(“Interface is implemented”); } } 这是Interface尚未实现的情况 public class My { public void X() { Console.WriteLine(“No Interface is implemented “); } } My obj = new My(); obj.X(); 这两种方法都会产生相同的结果。 实现接口的要求是什么?

我可以将成员定义/约束为实现两个接口,而不是generics吗?

以下代码显示了我想要做的事情; 也就是说,我想约束anObject,以便它可以用作各种方法的参数,使用IInterfaceOne或IInterfaceTwo,其中两者都不从另一个inheritance。 public interface IInterfaceOne { } public interface IInterfaceTwo { } public class Implementation : IInterfaceOne, IInterfaceTwo { } public interface IInterfaceOneAndTwo : IInterfaceOne, IInterfaceTwo { } public class UsingImplementation { IInterfaceOneAndTwo anObject = (IInterfaceOneAndTwo)(new Implementation()); //fails because Implementation doesnt acctually implement IInterfaceOneAndTwo } 但是这个例子失败了,因为IInterfaceOneAndTwo本身就是一个接口,而Implementation并没有实现它。 我知道如果我使用generics我可以约束它们,但我想知道,如果有一种方法可以做到这一点没有generics? 有没有办法说anObject应该实现IInterfaceOne和IInterfaceTwo ,而不使用IInterfaceOneAndTwo ?

如何在C#中使用partial方法来扩展现有的实现

如果这样做会很好。 我试图以错误的方式实现我的想法吗? 我想使用partial方法,以便能够扩展现有代码,并简单地插入/输出方法的实现。 基本上正是参考文献的内容: 部分方法使类设计者能够提供类似于事件处理程序的方法钩子,开发人员可以决定是否实现。 如果开发人员不提供实现,则编译器会在编译时删除签名。 我第一次尝试使用它是以下内容: DefinitionsBase.cs: namespace ABC { public partial class Definitions { // No implementation static partial void TestImplementaion(); } } DefinitionsExt.cs: namespace ABC { public partial class Definitions { static partial void TestImplementaion(){ // Implementation is here } } } Program.cs中: namespace ABC { class Program { static void Main(string[] […]

什么样的访问修饰符可以应用于类?

经过一番研究后,我确定您可以应用于类的唯一访问修饰符是: 公众 – 任何集会都有 internal – 仅在当前程序集中可用 但是下面的错误消息似乎暗示如果一个类没有在命名空间中定义,那么它可以被定义为private , protected或protected internal 。 public和internal是唯一可以在课堂上使用的类修饰符还是更多? using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test2343434 { class Program { static void Main(string[] args) { Tools.ToolManager toolManager = new Tools.ToolManager(); Console.ReadLine(); } } } namespace Tools { //error: Elements defined in a namespace cannot be explicitly //declared as […]

VB.NET与C#中的属性实现的多级inheritance

假设我有2个接口定义如下: public interface ISkuItem { public string SKU { get; set; } } public interface ICartItem : ISkuItem { public int Quantity { get; set; } public bool IsDiscountable { get; set; } } 当我在C#中实现接口时,VS会生成以下模板化代码: public class CartItem : ICartItem { #region ICartItem Members public int Quantity { get {…} set {…} } public bool […]

除了创建帮助器之外,创建静态方法的理想情况(实际示例)是什么?

我只是想了解静态方法所服务的目的以及我可以创建静态方法的理想情况,除了有些人会说静态方法用于创建帮助器。 考虑我有一个网站,将在我的公司使用,就像人力资源管理系统,如网站。 现在,管理员登录系统管理员后,将看到员工列表。因此,该方法很简单,除了从员工表中获取员工的所有详细信息,并将在网站上显示这些方法,此方法将在业务中定义在.net中访问这样的层: public class EmployeeBal { public List GetAllEmployees() { return Select * from Employee } } 这就是我如何从我的应用程序中调用此方法。对于Eg(.aspx页面或mvc控制器等….) var employeeBal= new EmployeeBal(); employeeBal.GetAllEmployees(); 所以我的问题是我应该将此方法创建为静态方法还是非静态方法? 注意:这只是方法的一个示例,此方法位于我的业务访问层中 。 考虑我有一个电子商务网站 ,在主页上我显示一些产品列表,并在访问该网站时,每个用户都可以看到该产品列表。 所以我的function与上面在Business acess层中定义的相同: public class ProductBal { public List DisplayProductonHomePage() { return Select * from Products } } 所以我的问题与是否将此方法创建为静态方法或非静态方法相同,如果同时有超过10个用户同时访问此网站会发生什么,那么这种方法的行为/含义是什么? 如果我们将此方法声明为静态,这个方法是否会满足每个用户的目的? 有人可以简单地解释每个场景来回答这个问题吗???

C#和Java中的方法重载

我在C#中运行了以下方法。 public float Add(float num1, long num2) { Console.WriteLine(“method 1”); return 0; } public float Add(int num1, float num2) { Console.WriteLine(“method 2”); return 0; } 在这里,如果我调用Add(1,1) ,它会给出歧义。 现在让我在第一个方法中交换float和long位置,如下所示: public float Add(long num1, float num2) { Console.WriteLine(“method 1”); return 0; } public float Add(int num1, float num2) { Console.WriteLine(“method 2”); return 0; } 现在它打印“方法2”作为输出。 第一种情况模棱两可的原因是什么? 如果我在我的代码中编写以下两种方法: […]