2011-12-23 66 views
0

主要問題: 我有一個引用類型(對象/類),我想指定訪問者的實現細節,但我不希望該類型是可實例化的,只能擴展。抽象類和訪問器

抽象根據我的理解,類不允許物體訪問屬性的訪問器,所以這對我來說很麻煩。

我該如何用最「正確」和優雅的方式去解決這個問題?

第二個問題: 我也喜歡重載訪問器的功能,如果有辦法嗎?一個原因是我有一個枚舉屬性,我想通過使用它的值(int)或枚舉引用類型來設置它。

回答

1

我想這應該做你想要什麼:

public abstract class MyParentClass 
{ 
    public enum MyEnum 
    { 
     one, 
     two, 
     three 
    } 

    private MyEnum _enumeration; 

    public string Name { get; private set; } 
    public MyEnum Enumeration { get { return this._enumeration; } } 
    public void SetEnumeration(string value) 
    { 
     // ... do something 
    } 
    public void SetEnumeration(MyEnum value) 
    { 
     // ... do something 
    } 
} 

有用於設置枚舉適當兩個重載方法ty和一些方法聲明瞭他們的身體,而整個類不能被實例化。

希望幫助:)

+0

謝謝,那就做到了! – Vort3x

2

抽象類不允許機構屬性的訪問器,據我瞭解

是他們不...這是完全合法的

abstract class MyBaseClass 
{ 
    private int _myProperty; 
    public int MyProperty 
    { 
     get { return _myProperty; } 
     set { _myProperty = value; } 
    } 
} 

也許你混淆抽象類和接口;接口可以聲明成員,但不能爲這些成員提供實現。

+0

我相信我可能會混淆它們。我對c#很陌生,正在閱讀文檔。我在msdn的文檔中誤解了一行,內容如下:「從抽象類派生的非抽象類必須包含所有繼承的抽象方法和訪問器的實際實現。「我假設,連同這個例子,我們不能把主體放在訪問器中,感謝你清除它 – Vort3x

+2

你應該從上面的引用中得到什麼是抽象類可以有抽象方法/訪問器,如果它們確實具體派生類必須提供一個實現,但是如果抽象類提供了一個實現,那麼派生類不需要。 –

2

摘要根據​​我的理解,類不允許物體作爲 屬性的訪問器,所以這對我來說會造成一些麻煩。

是的,他們做;

public abstract class Foo 
{ 
    public string Prop 
    { 
     get { return "yesTheyDo"; } 
    } 
} 

你把它們標記爲抽象?

1

您可以在abstract class中定義方法和屬性的主體。它的抽象部分基本上阻止它被實例化。要做到這一點,你可以寫下這個屬性:

public string Name 
{ 
    get { return "SomeName"; } 
} 

作爲一個例子。至於允許存取的超載,您可以執行下列操作之一:

// By setting this as 'virtual' you can allow classes that inherit from this to override the functionality if they so wish 
public virtual string Name 
{ 
    get { return "SomeName"; } 
} 

// or 
public virtual string GetName() 
{ 
    return "SomeName"; 
} 

一個建議:如果你想要的功能將被取代,只能訪問到繼承抽象類的類,使用protected關鍵字:

protected virtual void DoSomething() { }