Click here to Skip to main content
15,912,205 members
Home / Discussions / C#
   

C#

 
GeneralRe: When is it safe to use Monitor (lock) with Task? Pin
Bernhard Hiller18-Jan-17 21:05
Bernhard Hiller18-Jan-17 21:05 
AnswerRe: When is it safe to use Monitor (lock) with Task? Pin
Richard Deeming18-Jan-17 8:11
mveRichard Deeming18-Jan-17 8:11 
GeneralRe: When is it safe to use Monitor (lock) with Task? Pin
Bernhard Hiller18-Jan-17 21:11
Bernhard Hiller18-Jan-17 21:11 
GeneralRe: When is it safe to use Monitor (lock) with Task? Pin
Pete O'Hanlon18-Jan-17 21:15
mvePete O'Hanlon18-Jan-17 21:15 
QuestionGroup of Checkboxes Pin
eejaynic17-Jan-17 11:41
eejaynic17-Jan-17 11:41 
AnswerRe: Group of Checkboxes Pin
Gerry Schmitz17-Jan-17 13:02
mveGerry Schmitz17-Jan-17 13:02 
GeneralRe: Group of Checkboxes Pin
eejaynic17-Jan-17 14:11
eejaynic17-Jan-17 14:11 
GeneralRe: Group of Checkboxes Pin
Gerry Schmitz17-Jan-17 14:53
mveGerry Schmitz17-Jan-17 14:53 
AnswerRe: Group of Checkboxes Pin
Richard Deeming18-Jan-17 2:04
mveRichard Deeming18-Jan-17 2:04 
GeneralRe: Group of Checkboxes Pin
eejaynic18-Jan-17 9:03
eejaynic18-Jan-17 9:03 
QuestionCommunicating with unmanaged DLL Pin
Member 1041441717-Jan-17 2:43
Member 1041441717-Jan-17 2:43 
AnswerRe: Communicating with unmanaged DLL Pin
Midi_Mick17-Jan-17 3:19
professionalMidi_Mick17-Jan-17 3:19 
GeneralRe: Communicating with unmanaged DLL Pin
Member 1041441717-Jan-17 4:13
Member 1041441717-Jan-17 4:13 
AnswerRe: Communicating with unmanaged DLL Pin
Bernhard Hiller17-Jan-17 23:26
Bernhard Hiller17-Jan-17 23:26 
QuestionRe: Communicating with unmanaged DLL Pin
Member 1390693510-Jul-18 22:01
Member 1390693510-Jul-18 22:01 
QuestionGlade errors after launching debug Pin
Sascha Manns16-Jan-17 23:18
professionalSascha Manns16-Jan-17 23:18 
AnswerRe: Glade errors after launching debug [Solved] Pin
Sascha Manns17-Jan-17 5:41
professionalSascha Manns17-Jan-17 5:41 
QuestionImplementing Strategy Pattern Pin
Liagapi16-Jan-17 22:20
Liagapi16-Jan-17 22:20 
AnswerRe: Implementing Strategy Pattern Pin
Pete O'Hanlon16-Jan-17 22:46
mvePete O'Hanlon16-Jan-17 22:46 
GeneralRe: Implementing Strategy Pattern Pin
Liagapi16-Jan-17 23:22
Liagapi16-Jan-17 23:22 
GeneralRe: Implementing Strategy Pattern Pin
harold aptroot16-Jan-17 23:05
harold aptroot16-Jan-17 23:05 
GeneralRe: Implementing Strategy Pattern Pin
Liagapi17-Jan-17 2:25
Liagapi17-Jan-17 2:25 
AnswerRe: Implementing Strategy Pattern Pin
F-ES Sitecore16-Jan-17 23:18
professionalF-ES Sitecore16-Jan-17 23:18 
To answer your specific question you need to up caste to the type you need

public class Shape
{
    public string Name { get; set; }
}

public class Circle : Shape
{
    public double Radius { get; set; }
    public Circle(string name, double radius)
    { Name = name; Radius = radius; }
}

public class Square : Shape
{
    public double Side { get; set; }
    public Square(string name, double side)
    { Name = name; Side = side; }
}

public interface ICalculateAreaStrategy
{
    double Calculate(Shape shape);
}

public class CalculateCircleAreaStrategy : ICalculateAreaStrategy
{
    public double Calculate(Shape shape)
    {
        // "up cast" the Shape to a Circle, if shape is not a Circle then "as" will return null
        Circle c = shape as Circle;

        if (c == null)
        {
            return 0;
        }

        return 3.14 * c.Radius * c.Radius;
    }
}

public class CalculateSquareAreaStrategy : ICalculateAreaStrategy
{
    public double Calculate(Shape shape)
    {
        // "up cast" the Shape to a Square, if shape is not a Square then "as" will return null
        Square s = shape as Square;

        if (s == null)
        {
            return 0;
        }

        return s.Side * s.Side;
    }
}

public class CalculateAreaService
{
    readonly ICalculateAreaStrategy calculateAreaStrategy;

    public CalculateAreaService(ICalculateAreaStrategy strategy)
    {
        calculateAreaStrategy = strategy;
    }

    public double CalculateArea(Shape shape)
    {
        return calculateAreaStrategy.Calculate(shape);
    }
}


Usage

CalculateAreaService cas = new CalculateAreaService(new CalculateSquareAreaStrategy());

Console.WriteLine(cas.CalculateArea(new Square("Square", 3)));

cas = new CalculateAreaService(new CalculateCircleAreaStrategy());

Console.WriteLine(cas.CalculateArea(new Circle("Circle", 3)));

Console.ReadLine();


However the strategy pattern isn't that great for things that require different parameters such as you have with Square, Circle etc. I appreciate you're doing this to learn the strategy pattern and this might not be your ultimate use for it, but if you wanted to do something like you're doing then you could do it more simply like this

public interface ICalculateArea
{
    double Calculate();
}

public class CalculateCircleArea : ICalculateArea
{
    private Circle circle;

    public CalculateCircleArea(Circle circle)
    {
        this.circle = circle;
    }

    public double Calculate()
    {
        return 3.14 * circle.Radius * circle.Radius;
    }
}

public class CalculateSquareArea : ICalculateArea
{
    private Square square;

    public CalculateSquareArea(Square square)
    {
        this.square = square;
    }

    public double Calculate()
    {
        return square.Side * square.Side;
    }
}


Usage

List<ICalculateArea> calcs = new List<ICalculateArea>();
calcs.Add(new CalculateSquareArea(new Square("Square", 3)));
calcs.Add(new CalculateCircleArea(new Circle("Circle", 3)));

foreach (var calc in calcs)
{
    Console.WriteLine(calc.Calculate());
}


Or even simpler still have Square, Circle etc implement ICalculateArea and return their own area.
GeneralRe: Implementing Strategy Pattern Pin
Liagapi16-Jan-17 23:28
Liagapi16-Jan-17 23:28 
GeneralRe: Implementing Strategy Pattern Pin
Bernhard Hiller17-Jan-17 23:21
Bernhard Hiller17-Jan-17 23:21 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.