2016-09-12 7 views
0

Я работаю с абстрактным классом в 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" 
     } 
} 

Однако я не могу построить свойство «отключенного», потому что Person является абстрактным классом. Я не хочу определять свойство для каждого класса, происходящего из «Лица». Есть ли способ обойти это?

ответ

2

Вы не можете создать экземпляр абстрактного класса.

Что вы можете сделать, однако, является создание нового ребенка:

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(); 
} 
+0

Важно также отметить, что наличие публичных сеттеров на одном экземпляре - это действительно плохая идея. – Groo

+0

Я не уверен, что этого достаточно для моего проекта, но это определенно решение вопроса, который я задал. Благодаря! – celsound

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) класс может быть унаследован.

+0

Это был пример - мой фактический класс должен быть абстрактным. Но спасибо за подсказку. – celsound

0

Я не совсем понимаю ваши требования. Вы хотите убедиться, что только что созданный экземпляр производного класса имеет эти «неустановленные» значения? Это может быть сделано с помощью конструктора в абстрактном классе:

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

Да, абстрактный класс может иметь конструктор, даже если вы не можете создать его экземпляр непосредственно. Конструктор базового класса вызывается перед конструктором производного класса, поэтому вы можете перезаписывать эти «неустановленные» значения в конструкторе производного класса всякий раз, когда у него есть соответствующие параметры.

+0

Нет, мне нужна была ценность, чтобы иметь возможность ссылаться статически. У меня есть много методов, которые будут ожидать экземпляры этого класса, и мне приходится обрабатывать много логики для неопределенных/нулевых случаев. Я понял, что значение по умолчанию или неустановленное значение, с которым можно работать, было проще, чем обработка всех нулевых случаев, которые у меня были. – celsound

Смежные вопросы