我正在使用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"的类定义属性。有办法解决这个问题吗?
答案 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"只要有适当的参数,派生类的构造函数中的值。