Saturday, 10 August 2013

Can we use abstract class instead of interface with service contract in WCF

 Actually, ServiceContract and OperationContract can be used on classes directly instead of just interfaces (although i do not recommend such a thing myself).They can even be used on abstract classes and the code will compile successfully; rightly so, because according to the C# compiler there is nothing wrong.However while hosting the service, the ServiceHost will throw the exception mentioned by Otomii Lu because according to WCF rules, if a class has been marked with a ServiceContract attribute then another class cannot inherit from it. And if you think about it, it is pretty logical. Imagine what would happen if you declared a service like this. When a client calls the Add method, should the Add method implemented in the abstract class get called or the one in the Maths class.

    [ServiceContract]
    public abstract class MathsAbstract
    {
        [OperationContract]
        public abstract int Subtract(int num1, int num2);

        [OperationContract]
        public virtual int Add(int num1, int num2)
        {
            return num1 + num2;
        }
    }

    public class Maths : MathsAbstract
    {      
        public override int Add(int num1, int num2)
        {
            return num1 + num2 + 10;
        }

        public override int Subtract(int num1, int num2)
        {
            return num1 - num2;
        }
    }

No comments:

Post a Comment