2011-12-23 25 views
0

主な質問: アクセサーの実装の詳細を指定したい参照型(オブジェクト/クラス)がありますが、その型をインスタンス化することはできません。抽象クラスとアクセサー

要約クラスでは、プロパティのアクセサーには体が私の理解するところでは許可されていないので、私にとってはそれが問題になります。

どのように私は最も正しいとエレガントな方法でこれについて行きますか?

2番目の質問: 方法がある場合はアクセサをオーバーロードする機能も欲しいですか?その理由の1つは、enumプロパティがあることです。これは、value(int)またはenum参照型を使用して設定可能にしたいものです。

答えて

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

適切な列挙を設定するための2つのオーバーロードメソッドがあります。いくつかのメソッドは、クラス全体をインスタンス化できない間に、そのボディを宣言します。

希望するもの:

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