ReSharper 2024.3 Help

Create a decorator

The Decorator design pattern is used to dynamically add additional behavior to an object. In addition, by using interfaces, a decorator can be used to unify types in a manner similar to multiple inheritance.

Let’s take an example – suppose you have two objects, called Bird and Lizard, that you want to put into a Decorator:

class Bird { public void Fly() { ... } } class Lizard { public void Walk() { ... } }

1. Get object interfaces with the extract interface refactoring

Since a decorator cannot be inheriting from both of these classes, we can invoke the Extract Interface refactoring from the Refactor this menu Control+Shift+R for both of these objects to get their interfaces:

Creating a decorator with ReSharper

Calling this refactoring pops up a window asking us which members should appear in the interface:

Creating a decorator with ReSharper

After we do this for both our classes, we end up with the following code:

internal interface IBird { void Fly(); } class Bird : IBird { public void Fly() { ... } } internal interface ILizard { void Walk(); } class Lizard : ILizard { public void Walk() { ... } }

2. Declare a decorator class

With these interfaces, we can make a decorator. First, we declare a class called Dragon, indicating that it implements both IBird and ILizard:

class Dragon : IBird, ILizard { ... }

Now for the aggregated members. The easiest thing to do is to declare both of these as fields first, that is:

class Dragon : IBird, ILizard { private Bird bird; private Lizard lizard; }

3. Use quick-fix to initialize unused fields

Now, we can use apply a quick-fix to unused fields and initialize both of them from constructor parameters:

Creating a decorator with ReSharper

After this, our class will look as follows:

class Dragon : IBird, ILizard { private Bird bird; private Lizard lizard; public Dragon(Bird bird, Lizard lizard) { this.bird = bird; this.lizard = lizard; } }

4. Generate delegating members for source objects.

And now for the finishing touch – we want to generate delegating members for both bird and lizard. This is easy — we open the Generate menu Alt+Insert and choose Delegating Members:

Creating a decorator with ReSharper

ReSharper then asks us which members we need to delegate:

Creating a decorator with ReSharper

And here is the end result:

class Dragon : IBird, ILizard { public void Fly() { bird.Fly(); } public void Walk() { lizard.Walk(); } private Bird bird; private Lizard lizard; public Dragon(Bird bird, Lizard lizard) { this.bird = bird; this.lizard = lizard; } }

That’s it! Our decorator is ready.

Last modified: 11 February 2024