2010-12-31 3 views
13

Я столкнулся с интересной проблемой, и я ищу некоторые советы о том, как лучше справиться с этим ...Не удается определить статическое абстрактное свойство строки

У меня есть абстрактный класс, который содержит статический метод, который принимает статическую строку, которую я бы хотел определить как абстрактное свойство. Проблема заключается в том, что C# не не поддерживает следующие (см ConfigurationSectionName и Текущие свойства):

public abstract class ProviderConfiguration : ConfigurationSection 
    { 
     private const string _defaultProviderPropertyName = "defaultProvider"; 
     private const string _providersPropertyName = "providers"; 

     protected static string ConfigurationSectionName { get; } 

     public static Configuration Current 
     { 
      get { return Configuration)ConfigurationManager.GetSection(ConfigurationSectionName); } 
     } 
    } 

Я полагаю, один из способов справиться с этим было бы сделать ConfigurationSectionName НЕ абстрактным и затем создайте новое определение ConfigurationSectionName в производных классах, но это выглядит довольно хакерским. Любые предложения будут приветствоваться.

Gratias !!!

+3

Это невозможно. Что ты пытаешься сделать? – SLaks

+0

Возможный дубликат [Почему у меня нет абстрактных статических методов в C#?] (Https://stackoverflow.com/questions/3284/why-cant-i-have-abstract-static-methods-in-c) –

+0

Возможный дубликат [Как реализовать виртуальные статические свойства?] (Https://stackoverflow.com/questions/15346631/how-to-implement-virtual-static-properties) – peterh

ответ

9

Статические элементы не имеют полиморфизма, поэтому они не могут быть абстрактными. :(

Если это то, что вам нужно, не рассмотреть вопрос о внесении Singleton объекта, и читать объект с этим объектом.

+0

Спасибо. После того, как я рассмотрел то, что я пытался выполнить более подробно (и после некоторого сна), стало ясно, что это был ответ. – goombaloon

3

Просто используйте new для переопределения статического метода в производном классе. Ничего, что делает new плохо чтобы сделать для виртуальных методов и свойств применяется, так как имя типа должно быть обеспечено:.

public class BaseClass 
{ 
    public static int Max { get { return 0; } } 
} 

public class InteriorClass : BaseClass 
{ 
} 

public class DerivedClass : InteriorClass 
{ 
    public new static int Max { get { return BaseClass.Max + 1; } } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Console.WriteLine("BaseClass.Max = {0}", BaseClass.Max); 
     Console.WriteLine("InteriorClass.Max = {0}", InteriorClass.Max); 
     Console.WriteLine("DerivedClass.Max = {0}", DerivedClass.Max); 
     Console.ReadKey(); 
    } 
} 
+3

Это не будет работать с примером Goombaloon. Его базовый класс будет ожидать, что производный класс вернет необходимое значение, но поскольку производный класс будет показывать свойство, базовый класс будет иметь доступ только к своей собственной базовой реализации. – rossisdead

+1

Статическое свойство, реализующее поведение, не зависящее от производных реализаций, - это то, что нужно переопределить «новым», в данном случае «публичным статическим новым тоном конфигурации». Это делает имя базовой секции недействительным, кроме организации. –

0

То, что вы пытаетесь сделать, это невозможно, так как уже упоминалось

Я хотел бы попробовать someth ING как этот

public abstract class ProviderConfiguration : ConfigurationSection 
{ 
    public string ConfigurationSectionName { get; set; } 

    public static ProviderConfiguration Provider { get; set; } 

    public static Configuration Current 
    { 
     get { return (Configuration)ConfigurationManager.GetSection(Provider.ConfigurationSectionName); } 
    } 
} 

Тогда на практике:

public void DoStuff() 
{ 
    var provider = new DerivedProviderConfiguration(); 
    ProviderConfiguration.Provider = provider; 
} 
1

Хорошо, это не совсем создать статическую абстрактную собственность, но вы можете достичь желаемого эффекта.

Вы можете получить это с помощью дженериков:

public abstract class MyAbstractClass<T> 
{ 
    public static string MyAbstractString{ get; set; } 
    public static string GetMyAbstracString() 
    { 

     return "Who are you? " + MyAbstractString; 

    } 
} 

public class MyDerivedClass : MyAbstractClass<MyDerivedClass> 
{ 
    public static new string MyAbstractString 
    { 
     get 
     { 
      return MyAbstractClass<MyDerivedClass>.MyAbstractString; 
     } 
     set 
     { 
      MyAbstractClass<MyDerivedClass>.MyAbstractString = value;    
     } 
    } 

} 


public class MyDerivedClassTwo : MyAbstractClass<MyDerivedClassTwo> 
{ 
    public static new string MyAbstractString 
    { 
     get 
     { 
      return MyAbstractClass<MyDerivedClassTwo>.MyAbstractString; 
     } 
     set 
     { 
      MyAbstractClass<MyDerivedClassTwo>.MyAbstractString = value; 
     } 
    } 

} 


public class Test 
{ 

    public void Test() 
    { 

     MyDerivedClass.MyAbstractString = "I am MyDerivedClass"; 
     MyDerivedClassTwo.MyAbstractString = "I am MyDerivedClassTwo"; 


     Debug.Print(MyDerivedClass.GetMyAbstracString()); 
     Debug.Print(MyDerivedClassTwo.GetMyAbstracString()); 


    } 

} 

Так, называя класс теста вы получите:

«Кто ты Я MyDerivedClass» «Кто ты Я MyDerivedClassTwo»

Итак, у вас есть статический метод в абстрактном классе, но абстрактное значение отличается для каждого производного класса, хороший: D

Итак, что здесь? Трюк является общим тегом, компилятор генерирует различный абстрактный класс для каждого производного типа.

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

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