【问题标题】:What does it mean to decorate a class or parameter?装饰类或参数是什么意思?
【发布时间】:2015-09-21 09:39:20
【问题描述】:

对类或参数进行装饰或添加属性是什么意思?
目的是什么,我什么时候做?

欢迎提供资源链接和直接答案。

【问题讨论】:

  • 你可以用属性来装饰类和类成员。基本上,这个属性是从类 System.Attribute 派生的另一个类,它提供一些额外的信息。您可以在这里找到更多信息:msdn.microsoft.com/en-us/library/aa288454(v=vs.71).aspx
  • 在 c# 中,这可能意味着使用属性或装饰器模式。我假设您的意思是属性,因为它们适用于类和参数。
  • 请参阅here 以获取可以使用可点击徽章装饰控件的装饰器类的示例。子类化不仅是最重要的,而且还必须针对所有必要的控件类型进行。请注意,这是关于实例的,尽管

标签: c# class parameters


【解决方案1】:

当您在 C# 中添加装饰器时,就像向类/方法添加属性一样。会有一个属性附加到它上面。

如果你写单元测试,你会遇到一个简单的装饰器TestMethod,像这样:

[TestMethod]
public void TestMethod1()
{
}

框架将使用装饰器检查测试集中有哪些测试方法。

您可以查看属性here

还有一篇关于 Writing Custom Attributes 的好文章值得阅读

装饰器不限于“[ ]”形式的装饰器。还有一种设计模式,其他人之前已经提到过。

【讨论】:

  • 这个答案非常具有误导性。请参阅this
  • 恕我直言,C#中的属性装饰器模式实现的一种形式。 with this UML class diagram,调和是Decorator 类是System.Attribute,ConcreteDecoratorA 是Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute,操作是使方法对测试运行器框架可见。因为设计模式意味着当我们谈论事物时要在同一个页面上,所以说属性和装饰器是完全不同的概念是错误的。
  • “将附加职责动态附加到对象”中唯一缺少的是它不是运行时的。 Tho this 评论,下面的答案也说明了我对这个问题的看法。由于您必须定义装饰器的设计时间,因此主要优势是可重用性,这也是属性背后的关键概念。附加它运行时is still possible
  • 那么你的意思是如果我们用[DataMember]装饰一个属性,我们只是实现了装饰器模式
  • 我们使用了装饰器模式的实现,addedState(来自同一个 UML)在 WCF 的带有反射的序列化方法中使用。恕我直言,如果我们需要 C# 中的装饰器,我们应该始终考虑实现一个属性,因为该语言的支持。
【解决方案2】:

装饰器是四人组"Design Patterns" 书中描述的原始 23 种模式之一。他们描述得很好here

总结:

装饰器:在运行时向类添加附加功能 子类化将导致新类的指数级增长

模式与语言无关。它们是面向对象编程中常见问题的解决方案的描述。在不参考特定语言的情况下讨论它们是可能的,甚至是首选的。原书中的示例是用 C++ 和 Smalltalk 编写的。这本书在 1995 年首次出版时,Java 和 C# 都不存在。

【讨论】:

【解决方案3】:

装饰类意味着向现有类添加功能。例如,您的班级SingingPerson 有唱歌天赋。

public class SingingPerson
{
    public string Talent = "I can sing";
    public string DoTalent()
    {
        return Talent;
    }
}

后来,您决定 SingingPerson 类也应该能够跳舞,但不想改变现有的类结构。您所做的是通过创建另一个包含附加功能的类来装饰SingingPerson 类。您将要创建的这个新类接受 SinginPerson 对象。

public class SingingAndDancingPerson {
    SingingPerson person;
    public string Talent { get; set; }
    public SingingAndDancingPerson(SingingPerson person)
    {
        this.person = person;
    }

    public string DoTalent()
    {
        this.Talent = person.Talent;
        this.Talent += " and dance";
        return this.Talent;
    }
}

当您尝试创建这些类的实例时,输出将如下:

 SingingPerson person1 = new SingingPerson();
        Console.WriteLine("Person 1: " + person1.DoTalent());
        SingingAndDancingPerson person2 = new SingingAndDancingPerson(person1);
        Console.WriteLine("Person 2: " + person2.DoTalent());
        Console.ReadLine();

【讨论】:

  • 但这也意味着不是子类,不是吗?
  • @TaW to not subclass 是什么意思?
  • 为了使这个例子正确,装饰类必须可以分配给被装饰的类型,或者通过从它派生,它实现相同的接口。装饰的整个想法是能够:IComputer pc = new Computer().AddMouse().AddKeyboard(); if(deluxe) pc = pc.AddRGBLighting(); 当装饰器是外部类时,这将不起作用。
猜你喜欢
  • 1970-01-01
  • 2013-01-12
  • 2017-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-14
  • 2013-07-07
相关资源
最近更新 更多