2

private含まれているクラスのジェネリックを使用して、メソッド内でフィールドを定義する方法はありますか?

(質問の長さをお詫びします。私が求めていることを正確に特定するのに苦労しています)

具体的には、現在、次の要件を持つ3 つのクラスA、があります。BC

  1. BC呼ばれるフィールドがありますnameが、Aありません
  2. ACメソッドはありますLoad()が、Bありません
  3. のコレクションBとカスタムメソッドでC使用されますが、このメソッドは使用されませんnameAdd()A

これは私の現在の解決策です:

public class BaseClass
{
    public SomeType Load() { ... }
}

public interface IClass {
    string Name {get; set;}
}

public class MyList : SomeCollection<IClass>
{
    // Depends on x.Name, and may modify Name before adding x to the collection
    public new void Add(IClass x) { ... }
}

public class A : BaseClass { ... }

public class B : IClass { ... }

public class C : BaseClass, IClass { ... }

Namepublic がある場合、このソリューションは私にとってはうまくいきsetます。しかし、を変更できるx.Nameように適切にカプセル化する方法はありますが、とのインスタンスでは変更できませんか?Addx.Namex.NameBC

4

1 に答える 1

2

短い答えはノーです。メンバーを特定のクラスに選択的に公開することはできず、 とMyListの継承関係はありませんIClass。ただし、できることは、プロパティを公開して明示的に実装する追加の内部インターフェイスを作成する (または場合によっては内部にする) ことです。これは、プロパティを読み書きするには、インスタンスを内部インターフェイスにキャストする必要があることを意味します。これは、定義されているアセンブリ内でのみ可能です。IClassNameName

internal interface IClassName { string Name { get; set; } }

public class MyList : Collection<IClass>
{
    protected override void InsertItem(int index, IClass item)
    {
        var className = item as IClassName;
        if (className != null)
        {
            // do something with className.Name ...
        }
        base.InsertItem(index, item);
    }
}

public class B : IClassName { string IClassName.Name { get; set; } }

これはポリモーフィズムをオーバーライドするため、基本クラスのメソッドをバイパスするためにnewキーワードを使用していないことに注意してくださいAdd(たとえば、 のインスタンスを元の実装にキャストするMyListIList<IClass>Addが呼び出されます。これは悪いことです)。Collection<T>コレクションの継承用に設計されたクラスの適切なメソッドをオーバーライドします。

于 2012-04-22T09:47:42.213 に答える