2010-12-31 36 views
13

Tôi đã gặp sự cố thú vị và đang tìm kiếm một số đề xuất về cách xử lý tốt nhất ...Không thể xác định thuộc tính chuỗi trừu tượng tĩnh

Tôi có lớp trừu tượng chứa phương pháp tĩnh chấp nhận một chuỗi tĩnh mà tôi muốn định nghĩa là một thuộc tính trừu tượng. Vấn đề là C# không không hỗ trợ như sau (xem ConfigurationSectionNamehiện tài sản):

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); } 
     } 
    } 

Tôi cho rằng một trong những cách để xử lý này sẽ được thực hiện ConfigurationSectionName KHÔNG trừu tượng và sau đó tạo ra một định nghĩa mới của ConfigurationSectionName trong các lớp dẫn xuất, nhưng điều đó cảm thấy khá đáng sợ. Bất kì gợi ý nào cũng đều được hoan nghênh.

Gratias !!!

+3

Điều này là không thể. Bạn đang cố làm gì vậy? – SLaks

+0

Có thể trùng lặp [Tại sao tôi không thể có các phương thức tĩnh trừu tượng trong C#?] (Https://stackoverflow.com/questions/3284/why-cant-i-have-abstract-static-methods-in-c) –

+0

Có thể trùng lặp của [Làm thế nào để thực hiện các thuộc tính tĩnh ảo?] (Https://stackoverflow.com/questions/15346631/how-to-implement-virtual-static-properties) – peterh

Trả lời

9

Thành viên tĩnh không có đa hình, vì vậy chúng không thể trừu tượng. :(

Nếu đó là những gì bạn cần, hãy xem xét thực hiện một đối tượng Singleton, và đọc các tài sản ra khỏi đối tượng đó.

+0

Cảm ơn. Sau khi tôi xem xét những gì tôi đã cố gắng để thực hiện chi tiết hơn (và sau khi một số giấc ngủ), nó trở nên rõ ràng hơn rằng đây là câu trả lời. – goombaloon

3

Chỉ cần sử dụng new để ghi đè lên một phương pháp tĩnh trong một lớp học có nguồn gốc Không có gì mà làm cho new là một điều xấu. để làm cho các phương pháp ảo và tài sản được áp dụng kể từ khi tên loại phải được cung cấp:.

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

Điều này sẽ không hoạt động với ví dụ của goombaloon. Lớp cơ sở của anh ta sẽ mong đợi lớp dẫn xuất trả về giá trị cần thiết, nhưng vì lớp dẫn xuất sẽ hiển thị thuộc tính, lớp cơ sở sẽ chỉ có quyền truy cập vào việc thực hiện cơ sở của nó. – rossisdead

+1

Thuộc tính tĩnh thực hiện hành vi mà không phụ thuộc vào việc triển khai có nguồn gốc là những gì cần phải được thực hiện lại với "mới", trong trường hợp này là "tĩnh cấu hình mới hiện tại". Điều này làm cho tên phần cơ sở không sử dụng thực sự nào ngoài tổ chức. –

0

những gì bạn đang cố gắng làm là không thể, như những người khác đã đề cập

tôi muốn thử someth ing như thế này

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); } 
    } 
} 

Sau đó, trong thực tế:

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

Ok, điều này là không chính xác để tạo thuộc tính trừu tượng tĩnh, nhưng bạn có thể đạt được hiệu quả mong muốn.

Bạn có thể có được điều này bằng cách sử dụng Generics:

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()); 


    } 

} 

Vì vậy, cách gọi lớp thử nghiệm, bạn sẽ nhận được:?

"? Bạn Tôi là ai MyDerivedClass" "Bạn Tôi là ai MyDerivedClassTwo"

vì vậy, bạn có một phương pháp tĩnh trong một lớp trừu tượng nhưng giá trị trừu tượng là khác nhau cho mỗi lớp có nguồn gốc, đẹp: D

Ok, vậy, những gì đang diễn ra ở đây? Bí quyết là thẻ chung, trình biên dịch là tạo một lớp trừu tượng khác cho mỗi loại có nguồn gốc.

Như tôi đã nói nó không phải là một thuộc tính trừu tượng, nhưng bạn có được tất cả lợi ích của các thuộc tính tĩnh trừu tượng, là các hàm lập trình tĩnh trên lớp trừu tượng của bạn, nhưng sử dụng các tham số tĩnh khác nhau cho mỗi loại.

Các vấn đề liên quan