【问题标题】:How can I define a static instance of an abstract class?如何定义抽象类的静态实例?
【发布时间】:2016-09-12 00:35:16
【问题描述】:

我正在使用 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”的每个类定义属性。有没有办法解决这个问题?

【问题讨论】:

    标签: c# .net static abstract-class


    【解决方案1】:

    您不能创建抽象类的实例。

    但是,您可以做的是创建一个新孩子:

    public class UnsetPerson : Person
    {
        public UnsetPerson() : base()
        {
            this.Name = "Unset Name";
            this.PhoneNumber = "Unset Phone";
        }
    }
    

    然后在你的基类上设置static 属性:

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

    【讨论】:

    • 还需要注意的是,在单例实例上使用公共设置器是一个非常糟糕的主意。
    • 我不确定这是否满足我的项目需求,但这绝对是我所问问题的解决方案。谢谢!
    【解决方案2】:

    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)类都可以被继承。

    【讨论】:

    • 这是一个例子——我的实际类需要是抽象的。不过谢谢你的提示。
    【解决方案3】:

    我不完全理解您的要求。你想确保一个新创建的派生类实例具有那些“未设置”的值吗?这可以通过抽象类中的构造函数来完成:

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

    是的,一个抽象类可以有一个构造函数,即使你不能直接实例化它。基类的构造函数在派生类的构造函数之前调用,因此只要派生类的构造函数具有适当的参数,您就可以覆盖那些“未设置”的值。

    【讨论】:

    • 不,我需要一个能够静态引用的值。我有很多方法需要这个类的实例,并且我必须处理很多未定义/空情况的逻辑。我认为拥有一个能够使用的默认值或未设置值比处理我拥有的所有 null 情况更容易。
    猜你喜欢
    • 2021-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多