views:

245

answers:

6

Can I create instance of abstract class in C#/.net like in Java ?

Additional Info

I think a lot of us does not understand what do I mean? So, In java I can create abstract class like this :

Simple abstract class :

/**
 * @author jitm
 * @version 0.1
 */
public abstract class TestAbstract
{
    public abstract void toDoSmth();
}

Code where I've create instance of abstract class

/**
 * @author jitm
 * @version 0.1
 */
public class Main {
    public static void main(String[] args) {
        TestAbstract testAbstract = new TestAbstract() {
            @Override
            public void toDoSmth() {
                System.out.println("Call method toDoSmth");
            }
        };
    }
}

Can I to do in c# something like this ?

+6  A: 

No. Not directly. The closest you can come (assuming you have the following class structure):

public abstract class AbstractClass
{
}

public class ChildClass : AbstractClass
{ 
}

Is:

AbstractClass instance = new ChildClass();
Justin Niessner
A: 

If you're talking about an abstract class, the answer is no. They are almost like interfaces, but allow implementations which can later be used by a concrete object.. You must create a concrete class which inherits from the abstract class

See more at Abstract Classes

Thiago Santos
@Thiago: Please do not post .NET 1.1 links!
John Saunders
+1  A: 

No, you cannot - that's why the class is called abstract. You can derive from it and thereby create concrete implemented classes that you can instantiate.

Marius Schulz
A: 

What you are asking is a little confusing. If you are asking if you can create an instance of a class, then of course you can. Why would C# or any language let you be able to define a class, but not instantiate it?

If you are asking if you can create an instance of an abstract class, the answer is no. You must derive a new class from the abstract class, then instantiate the new class.

icemanind
A: 

C# is the same as Java in this case, you cannot instantiate an abstract class.

Struan
In Java I can, only I need it is implement abstract methods, but, I can to do it like anonymous implementation.
jitm
In that case, then no - C# (as far as I know doesn't allow you to create an anonymous implementation of an abstract class).
RQDQ
You still aren't instantiating the abstract class, you are instantiating an anonymous subclass.
Struan
Yes, I understood, but without creating new type only anonymous implementation of abstract body.
jitm
+7  A: 

Neither in Java nor in C# you can create an instance of an abstract class. You will always need to create a concrete class that inherits from the abstract class. Java let you do it without naming the class, using anonymous classes. C# does not give you that option.

(Edited to show a delegate as a replacement. I don't have access to VS here, so it may not compile, but this is the idea )

Usually in Java when you use an abstract class with a single abstract method (SAM) what you are really trying to achieve is to pass some code as a parameter. Let's say you need to sort an array of objects based on the class name, using Collections.sort(Collection, Comparator) (I know Comparator is an interface, but it is the same idea) Using an anonymous class to avoid extra typing, you can write something like

   Comparator<Object> comparator = new Comparator<Object>{
        @Override
        public int compare(Object o1, Objecto2) {
            return o1.getClass().getSimpleName().compareTo(o2.getClass().getSimpleName()));
        }//I'm not checking for null for simplicity
   } 
   Collections.sort(list, comparator)

In c# 2.0 and beyond you can do pretty much the same using the Comparison<T> Delegate. A delegate can be thought as a function object, or in java words, an class with a single method. Yo dont even need to create a class, but only a method using the keyword delegate.

Comparison<Object> comparison = delegate(Object o1, Object o2)
{
    return o1.class.Name.Compare(o2.class.Name);        
};

list.sort(comparison);

In c# 3.0 and beyond you can even write less code using lambdas and type inference

list.sort((o1, o2)=> o1.class.Name.Compare(o2.class.Name))

Anyway, if you are migrating code form java to c# you should read about delegates...in many of cases you will use delegates instead of anonymous classes. In your case, you are using a method void toDoSmth(). There is a delegate called Action which is pretty much the same thing, a method with no parameters and no return.

Pablo Grisafi
Yes, my question was can I create instance like in java (using anonymous) currently I understood that I cannot.Thanks.
jitm
In some (most?) cases, you should replace anonymous classes with delegates and you will write even less code...Specially with one method classes.
Pablo Grisafi
2 Pablo: Could you post example how to do it, because currently I've created simple class from abstract and use it.
jitm
Posted in answer...edited...
Pablo Grisafi
Thanks, this is great answer...
jitm