.net是否委托真实对象?

时间:2010-10-19 01:21:43

标签: c# .net

我在C#工作了几年,有一件事总是让我烦恼。代表们。它们没有状态,它们是对象方法的指针,是处理线程或.net必须提供的任何其他类型的并行编程技术时唯一的方法。

我主要担心的是,当以面向对象的方式编程时,代表通过打破以下概念来打破范式:如果你去面向对象,那么使用UML和CRC的设计阶段应该映射到你使用的语言。

正如标题所要求的那样,代表是真实对象或编程异常,需要在面向对象设计范围之外完成。

因此,如果对象没有状态并且委托可以用UML建模,那么它是否可以成为对象?

一位知名人士曾就天文学进行过公开讲座。他描述了地球如何围绕太阳运行,以及太阳如何围绕着被称为银河系的大量恒星的中心轨道运行。讲座结束时,房间后面的一位小老太起身说:“你告诉我们的是垃圾。这个世界实际上是一只支撑在巨龟背上的平板。”在回答说:“乌龟站在什么地方?”之前,科学家笑了笑。 “你很聪明,年轻人,非常聪明”,老太太说。 “但它一直都是海龟!----斯蒂芬霍金斯

我认为这与对象及其所依赖的基本类型非常相关。你能真正说出它的物体吗?

5 个答案:

答案 0 :(得分:16)

他们是真实的对象。

当您使用UML进行建模时,通常会使用接口。他们有州吗?不,它们是否更少面向对象?当然不是。

当然,委托可以用UML建模。

我认为它们代表了一种更具功能性的方法,因为它们是作为第一类对象的函数。这可能会让你感到担忧,但它并没有减损它们确实是物体的事实。

答案 1 :(得分:7)

很明显,如果没有人使用闭合锤,这一点就无法实现。不,不是“关闭这个问题”的锤子。

Action @ICanHazState()
{
    int callcount = 0;
    Action retval = delegate {
       System.MessageBox("I haz bin calld " + callcount.ToString() + " tims b4");
       if (++callcount > 5) throw new InvalidOperationException("Call limit exceeded.  Kaboom!");
    };
    return retval;
}

Complete compilable example here

More complex example (requires C# 4 e.g. Visual Studio 2010)

答案 2 :(得分:3)

来自维基百科(Object (computer science):在面向对象编程领域,对象通常用于表示封装实体的属性(对象元素)和行为(方法或子例程)的编译。委托全部都是子类来自.Net中的Delegate类.Datement类当然具有属性(即属性):Method& Target。该类还具有行为(方法):Combine,CreateDelegate等。

委托是不是指针,因为指向方法的简单指针无法封装委托所做的'this'指针。正如Gabe指出的那样,代表们也有状态,他们可能是空的(在这种情况下调用它们什么也不做)或者他们可以在列表中有一个或多个方法。

满足对象的标准后,它们就是对象。

Q.E.D。

答案 3 :(得分:2)

是。它们没有打破面向对象的范式。他们只是接受并扩展它;)

答案 4 :(得分:2)

定义“对象”。

您的定义似乎是一个对象,'事物'必须具有可变状态并且是可继承的。

根据该定义,委托不是对象。但是,我认为这个定义极其有限。实际应用程序中的“对象”的整个类别都不符合该定义。函数,开始。许多装饰器类型也会因该定义以及过滤器对象等原因而失败。

例如,如果你回到Smalltalk,truefalse都是对象。根据你的定义,他们不会。