Setting default value for properties of Interface?
Asked Answered
H

4

12

I have an Interface which contains one property. I need to set the default value for that property. How to do that?. Also is it good practice to have a default value for a property in Interface? or here using an abstract class instead is a apt one?

Humber answered 12/10, 2011 at 5:20 Comment(0)
A
13

You can't set a default value to a property of an interface.

Use abstract class in addition to the interface (which only sets the default value and doesn't implement anything else):

    public interface IA {
        int Prop { get; }

        void F();
    }

    public abstract class ABase : IA {
        public virtual int Prop
        {
            get { return 0; }
        }

        public abstract void F();
    }

    public class A : ABase
    {
        public override void F() { }
    }
Assyriology answered 12/10, 2011 at 5:23 Comment(2)
Petar, Does, Use abstract class in addition to the interface means,i should change the Interface to an abstract class?Humber
No it means use an abstract class which implements the interface and then extend it.Assyriology
M
12

With C#8, interfaces can have a default implementation. https://devblogs.microsoft.com/dotnet/default-implementations-in-interfaces/

Melodics answered 21/12, 2020 at 12:13 Comment(1)
this does not seem to include default property values, though it does include default property implementationsCristiecristin
C
1

Interfaces contain no implementation. All they do is state member signatures.

An implementation of an interface is free to have whatever default value it likes for any property.

E.g. an abstract class can return a default value for any of it's properties.

Commentary answered 12/10, 2011 at 5:23 Comment(2)
The sentence "Interfaces contain no implementation." is now invalid: learn.microsoft.com/en-us/dotnet/csharp/language-reference/…Numeral
Sure, but I'm not going to go back and update old answers. They have timestamps, as do subsequent versions of languages, etc.Commentary
C
0

This is possible with static fields.Because, interfaces cannot contains instance fields. Static fields are not instance fields.

Or you can use literal values. For example, I use Age property in interface below.

public interface IMyDefault
{
    private static string _name = "Yusif";

    // Has default implementation
    string Name
    {
        get
        {
            return _name;
        }

        set
        {
            _name = value;
        }
    }

    int Age { get => 18; }

    // Hasn't default implementation
    string Surname { get; set; }
}

public class MyDefault : IMyDefault
{

    // We only implement Surname in MyDefault.cs
    public string Surname { get; set; }
}

But, you can access default implemented properties only after cast object to interface.

For example:

Code below will not compile

MyDefault myDefault1 = new MyDefault();

Console.WriteLine(myDefault1.Name);

Code below will compile

IMyDefault myDefault2 = new MyDefault();

Console.WriteLine(myDefault2.Name);
Conservation answered 13/1 at 14:20 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.