如何定义抽象类的静态实例?

时间:2016-09-12 00:35:16

标签: c# .net static abstract-class

我正在使用C#中的抽象类继承多个类。我在代码中需要的一件事就是静态属性,例如" Unset",这将是类的静态实例,其主要属性定义为未设置值。一般的例子如下:

public abstract class Person
{
        public string Name {get; set;}
        public string PhoneNumber {get; set;}
        public static readonly Person Unset = new Person() {
            Name = "Unset Name"
            PhoneNumber = "Unset Phone"
        }
}

然而,我无法构建" Unset"属性因为Person是一个抽象类。我不想为每个来自" Person"的类定义属性。有办法解决这个问题吗?

3 个答案:

答案 0 :(得分:2)

您无法创建抽象类的实例。

然而,你可以做的是创造一个新的孩子:

{
  "Model": {
    "link": "http://www.google.com",
    "name": "John"
  },
  "Widget1": {
    "$type": "Doodad, JsonTest",
    "Size": 10,
    "Name": "Sprocket"
  },
  "Widget2": {
    "$type": "Thingy, JsonTest",
    "Strength": 5,
    "Name": "Coil"
  }
}

http://www.google.com
John
Sprocket (Doodad)
Coil (Thingy)

然后在基类上设置public class UnsetPerson : Person { public UnsetPerson() : base() { this.Name = "Unset Name"; this.PhoneNumber = "Unset Phone"; } } 属性:

static

答案 1 :(得分:0)

documentation表示abstract关键字表示正在修改的内容具有缺失或不完整的实现。因此,它无法直接创建,只能通过继承来使用。

由于您(当前)在抽象类中没有任何抽象成员,因此您可以使用virtual类,它允许您提供可以选择覆盖的默认实现。

public virtual class Person
{
    public virtual string Name { get; set; }
    public virtual string PhoneNumber { get; set; }
    public static readonly Person Unset = new Person() {
        Name = "Unset Name",
        PhoneNumber = "Unset Phone"
    };
}

如果您不需要/想要覆盖继承类中的任何类成员,则不需要创建抽象类或虚拟类。任何(非sealed)类都可以继承。

答案 2 :(得分:0)

我不完全了解您的要求。您是否希望确保派生类的新创建实例具有" unset"值?这可以通过抽象类中的构造函数来完成:

protected Person()
{
    Name = "Unset Name";
    PhoneNumber = "Unset Phone";
}

是的,抽象类可以有一个构造函数,即使你不能直接实例化它。在派生类的构造函数之前调用基类的构造函数,以便您可以覆盖那些" unset"只要有适当的参数,派生类的构造函数中的值。