Tag: 抽象

抽象/虚拟方法的通用返回类型

我有两个基类之间的关系: public abstract class RecruiterBase { // Properties declare here // Constructors declared here public abstract IQueryable GetCandidates(); } public abstract class CandidateBase { // Properties declare here // Constructors declared here } 他们的具体实现如下: public class CandidateA : CandidateBase { // Constructors declared here } public class RecruiterA : RecruiterBase { // Constructors declared here […]

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 […]

使用枚举来选择要实例化的类

我有一个枚举,我想与dto联系: public enum DtoSelection { dto1, dto2, dto3, } 此枚举中有108个值和值。 我为这些dto中的每一个都有一个dto对象: public class dto1 : AbstractDto { public int Id { get; set; } //some stuff specific to this dto } 我正在尝试创建一个方法(最终是一个服务),它将返回一个与所讨论的dto相关联的类型的新dto对象: private AbstractDto(int id) { if (id == DtoSelection.Dto1.ToInt()) //extension method I wrote for enums return new Dto1(); if (id == DtoSelection.Dto2.ToInt()) return new […]

从非generics类重写抽象generics方法

基类 class Drawer { public abstract void Draw(T type); } 派生类#1 class ADrawer : Drawer { public override void Draw(List list) { foreach (var a in list) { DrawA(a); } } public void DrawA(Agent a) { //draw code here } } 派生类#2 class AnotherDrawer : Drawer { public override void Draw(T number) { if (number […]

防止暴露基类(抽象类)

所以我查看了许多相关的问题,但似乎没有一个问题适合。 至少不是我目前的理解。 由于这是一个简单的问题,我将简要介绍我的问题和代码。 我有五个class: internal class A internal abstract class B : A internal abstract class C : B public class D : C public class E { public void X(C c) { } } 这里有一个明显的可访问性问题,参数C在public方法中使用。 我需要在不暴露C类的情况下访问D类。 我相信这可能是由于abstract关键字的性质以及我使用它的最小经验。 到目前为止,我从未有过创建abstract类的必要性,这是我第一次在这个级别上处理它。 根据我的理解,在这种情况下,只要我记得正确地实现所有内容,就不必使用abstract类。 我的问题 我应该创建一个具有D私有实例的类F作为一种包装来防止暴露吗? 使用abstract的可靠理由是什么,因为我不相信这段代码是一个很好的例子。 我可以在不暴露A , B或C情况下暴露D其他方法是什么? 笔记 我正试图通过我目前的变化进行外科手术。 最初所有的课程都是私人的。 我看了很多相关的post(这里有几个): 与抽象类不可访问的可访问性 可访问性不一致 可访问性不一致 可访问性问题不一致[重复] 可访问性不一致,属性类型

如何在运行时获取当前的类名?

我正在尝试将当前的类名称转换为字符串。 例如: public class Marker : Mark { string currentclass = ???; } public abstract class MiniMarker : Mark { } 我想从Marker类中获取字符串,所以我不必将它放在我从中创建的每个抽象类中。 我希望字符串是MiniMarker ,或者是抽象类的名称。 我尝试了MethodBase.GetCurrentMethod().DeclaringType ,但它没有用。

委托会员超过经典function的优点或缺点是什么?

class my_class { public int add_1(int a, int b) {return a + b;} public func add_2 = (a, b) => {return a + b;} } add_1是一个函数,而add_2是一个委托。 但是在这种情况下,代表们可以填补类似的角色。 由于先例和语言的设计,C#方法的默认选择应该是函数。 然而,这两种方法都有利有弊,所以我已经制作了一份清单。 这两种方法都有任何优点或缺点吗? 传统方法的优点。 更常规 函数的外部用户看到命名参数 – 对于add_2语法arg_n和类型一般信息不够。 使用intellisense-ty Minitech可以更好地工作 适用于reflection – ty Minitech inheritance – Eric Lippert 有一个“这个” – ty CodeInChaos 更低的开销,速度和内存 – ty Minitech和CodeInChaos 在更改和使用函数方面,不需要考虑public \ […]

GoF Factory的命名约定?

此模式使用抽象工厂,然后是工厂的实现。 我确信这两个类有一个标准的命名约定,但我不知道它是什么。 例如: public abstract class ChocolateFactory { }; public class MyChocolateFactory { } : ChocolateFactory 这里的标准惯例是什么? 我正在考虑ChocolateFactoryBase或ConcreteChocolateFactory,但也许还有别的东西(很像Enum往往以Enum为后缀,例如PetTypeEnum这样你就可以做PetTypeEnum PetType; 希望这不是主观的。

.Net和In C#上的多态数字

真的很遗憾在.Net中没有数字的多态性,即没有统一不同类型的数字类型的数字接口,如bool,byte,uint,int等。在极端情况下,我们想要一个完整的抽象包代数类型。 Joe Duffy有一篇关于这个问题的文章: http://www.bluebytesoftware.com/blog/CommentView,guid,14b37ade-3110-4596-9d6e-bacdcd75baa8.aspx 您如何在C#中表达这一点,以便在不影响.Net或C#的情况下对其进行改造? 我有一个想法,首先要定义一个或多个抽象类型(接口,如INumeric – 或者比它更抽象),然后定义实现这些的结构,并在提供返回新类型的操作时包装类型(如int)(例如Integer32: INumeric;其中添加将被定义为 public Integer32 Add(Integer32 other) { return Return(Value + other.Value); } 我有点害怕这段代码的执行速度,但至少它是抽象的。 没有运营商超载的好处…… 还有其他想法吗? .Net看起来不像一个可行的长期平台,如果它不能拥有我认为的这种抽象 – 并且对它有效。 抽象是重用。 更新: 到目前为止,这是一个示例实现类型签名: public struct Integer32 : INumeric, IOrder 补偿缺乏协变返回类型。

使用更多指定的返回类型覆盖抽象属性(协方差)

class Base {} abstract class A { abstract public List Items { get; set; } } class Derived : Base {} class B : A { private List items; public override List Items { get { return items; } set { items = value; } } } 编译器说B.Items必须是Base元素列表“匹配重写成员”A.Items。 我怎样才能做到这一点?