MetaGuru
MetaGuru

Reputation: 43863

I've found many questions on abstract classes and interfaces but answer me this: Can an abstract class do everything an interface can?

I'm really confused, and I've read a TON of questions on this topic and I have not been able to pinpoint anything specifically that an interface can do that an abstract class cannot do.

Is there anything an interface can do that an abstract class cannot do?

I am asking in the context of my Java class, but feel free to remove the java tag if it applies to other languages as well (possibly C#?).

Edit: I understand that an abstract class can do things an interface cannot, but if an abstract class can do everything an interface can do, then what is the point of an interface? What does "implement multiple interfaces" mean?

Upvotes: 0

Views: 823

Answers (4)

Margus
Margus

Reputation: 20058

Well read:

What does "implement multiple interfaces" mean?

Consider:

public static interface Ifun extends Comparable<Ifun>, Serializable {}//or 
public static class Cfun2 implements Comparable<Cfun>, Serializable 

When class implements Ifun, then:

  • Comparable interface imposes a total ordering on the objects of each class that implements it. Objects that implement this interface can be sorted automatically by Collections.sort.
  • The serialization interface has no methods or fields and serves only to identify the semantics of being serializable.

It means object can have more then 1 interface.

Upvotes: 2

Martin Booth
Martin Booth

Reputation: 8595

You can't inherit from multiple abstract classes in c#, but you can implement multiple interfaces.

I think this may apply to java too

Edit:

You can't inherit from multiple classes. If you have an abstract class called Clonable, and an abstract class called Disposable then you can only inherit one of these classes and you're forced to make a decision about which class your class should be a subtype of:

e.g:

    public abstract class Clonable
    {
        public abstract void Clone();
    }

    public abstract class Disposable
    {
        public abstract void Dispose();
    }

    // MyClass cannot be Disposable too, it is not allowed by the language

    public class MyClass : Clonable
    {
        override void Clone()
        {

        }
    }

Note it is a design decision of the language to allow you only to inherit from one class.

If on the other hand you have interfaces, the language allows you to implement both

e.g.

    public interface IClonable
    {
        void Clone();
    }

    public interface IDisposable
    {
        void Dispose();
    }

    public class MyClass : IClonable, IDisposable
    {
        void IClonable.Clone()
        {

        }
        void IDisposable.Dispose()
        {

        }
    }

Upvotes: 7

Buhake Sindi
Buhake Sindi

Reputation: 89179

Interfaces are non instantiable classes that only contains methods that subclasses can inherit. The only thing that interfaces can do (in java) is that a class can implement many interfaces while a class can only extend 1 abstract class.

Upvotes: 1

Interfaces as such cannot do what abstract classes do.

This is because abstract classes can contain code - interfaces cannot. But any given class can only have one superclass - extends - as opposed to any number of interfaces - implements, so if you use abstract classes you essentially paint yourself in a corner of the inheritance tree, because your class can only extend a single class.

This limitation does not apply to interfaces, allowing a single class to have many purposes depending on how many interfaces it implements.

Upvotes: 8

Related Questions