[Mono-dev] Re: Constructor implementation obligation via interface?

Zac Bowling zac at zacbowling.com
Wed May 24 22:15:18 EDT 2006


System.Text.Encoding.GetEncoding(...) is an example of a very complex
factory built in. 

Here is a method i use:
(this might not compile, i didn't test it, just an example)

public enum ShapeType
{
  Circle, 
  Square,
  Triangle
}

public abstract class Shape
{
  public static Shape GetShape(ShapeType st)
  {
    switch (st)
    {
      case ShapeType.Circle:
        return new Circle();
      case ShapeType.Square:
        return new Square();
      case ShapeType.Triangle():
	return new Triangle();
      default:
        throw new Exception("Unknown shape");
    }
  } 
  public abstract int Sides
  {
    get{return -1;)
  }
}

public class Circle : Shape
{
  public override int Sides
  {
   get{return Int32.MaxValue;}
  }
}
public class Square : Shape
{
  public override int Sides
  {
   get{return 4;}
  }
}
public class Triangle : Shape
{
  public override int Sides
  {
   get{return 3;}
  }
}


in the code you just say:

Shape myShape = Shape.GetShape(ShapeType.Circle);
Console.WriteLine("This shape has {0} sides", myShape.Sides);

On Wed, 2006-05-24 at 16:35 +0200, Robert Jordan wrote:
> Ympostor wrote:
> > Kamil Skalski escribió:
> >> There is a slight problem. In C# empty constructors are added
> >> automatically, so you can't define a class without empty constructor.
> >> What you can do is to define a class with private empty constructor,
> >> which will prevent user from instanciating it directly. I guess there
> >> is not way to forbid this.
> > 
> > Thanks for your comment.
> > 
> > But sorry because I think I haven't understood you completely.
> > 
> > You say I can't define a class without empty constructor? That's not 
> > true. When you create an empty Console application in Visual Studio, 
> > there is a "class Program" that contains an static method but does not 
> > have any constructor.
> 
> It has an implicit default ctor.
> 
> > If you were trying to say that all classes, at the compiler level, 
> > contain an empty constructor, then ok; but what I want to do is to force 
> > a class to have a public empty constructor, and, if it doesn't have it, 
> > have the compiler to warn me because of the semantic requisite.
> > 
> > Is there a way to achieve this?
> 
> No, not directly. If you really feel like you'd need this
> semantic sugar, you may provide a creator for the class:
> 
> interface ICreator
> {
>    Foo CreateFoo ();
> }
> 
> class Foo
> {
>    public Foo ()
>    {
>    }
> }
> 
> class FooCreator : ICreator
> {
>    public Foo CreateFoo()
>    {
>      return new Foo ();
>    }
> }
> 
> Search the Web for "C# factory pattern".
> 
> Robert
> 
> _______________________________________________
> Mono-devel-list mailing list
> Mono-devel-list at lists.ximian.com
> http://lists.ximian.com/mailman/listinfo/mono-devel-list
> 
-- 
Zac Bowling <zac at zacbowling.com>




More information about the Mono-devel-list mailing list