0

いくつかの保護されたメンバーを持つ抽象基本クラスがありますが、抽象メンバーはありません:

internal abstract class BaseClass
{

    protected readonly string Var1;
    protected readonly string Var2;

    protected BaseClass(string var1, string var2)
    {
        Var1 = var1;
        Var2 = var2;
    }

    protected int DoSomething1(string s)
    {
    }
}

そして、この基本クラスを実装し、それぞれに異なるいくつかの特定のメソッドを持ついくつかのクラス:

internal sealed class Child1:BaseClass
{
    internal Child1(string var1, string var2)
        : base(var1, var2)
    {
    }

    internal bool DomeSomethingSpecificForChild1(int i)
    {
    }

}

今、私はタイプの変数を持ちたい別のクラスを持っていますBaseClass。必要に応じて、子タイプでインスタンス化します。しかし、特定の方法が知られていないため、これは機能していません。

public class MyClass
{
        private BaseClass myBaseClass;

    public bool DomeSomethingSpecific(int i)
    {
            myBaseClass = new Child1("a","b");
            myBaseClass.DomeSomethingSpecificForChild1(i);
    }
}

私がやりたいことを達成できる方法はありますか?または、メソッドの内部スコープで変数を宣言する必要がありMyClassますか?

public class MyClass
{
        private BaseClass myBaseClass;

    public bool DomeSomethingSpecific(int i)
    {
            var child1 = new Child1("a","b");
            myBaseClass.DomeSomethingSpecificForChild1(i);
    }
}

しかし、この方法では、クラスが実装する確実性がありませんBaseClass

インターフェイスはパブリックではなく内部にとどめておきたいのでオプションではなく、基本クラスをインスタンス化したくないので、ここでは抽象が良い選択だと思いました..

4

4 に答える 4

0

抽象メソッドを使用したい場合があります。

internal abstract class BaseClass
{

    protected readonly string Var1;
    protected readonly string Var2;

    protected BaseClass(string var1, string var2)
    {
        Var1 = var1;
        Var2 = var2;
    }

    protected int DoSomething1(string s)
    {
    }

    public abstract bool DoSomethingSpecific(int i);
}

その後

internal sealed class Child1:BaseClass
{
    internal Child1(string var1, string var2)
        : base(var1, var2)
    {
    }

    public override bool DomeSomethingSpecific(int i)
    {
    }

}
于 2012-06-21T09:36:19.213 に答える
0

明らかに、変数を基本クラスのインスタンスとして宣言すると、基本クラスによって公開されたメソッドのみを使用できます。

特定のクラス メソッドを使用するには、オブジェクトをキャストする必要があります。

if(child is Child1)
{
    Child1 c1 = child as Child1
    if(c1 != null) c1.specificMethod1();
}
if(child is Child2)
{
    Child2 c2 = child as Child2
    if(c2 != null) c2.specificMethod2();
}
// ...
于 2012-06-21T09:41:15.890 に答える
0

子クラス オブジェクトを基底クラスにキャストする

public class MyClass
{
    public bool DomeSomethingSpecific(int i)
    {
            var child1 = new Child1("a","b");
            ((myBaseClass)child1).DomeSomethingSpecificForChild1(i);
    }
}
于 2012-06-21T09:37:48.277 に答える
0
private BaseClass child;

public bool DomeSomethingSpecific(int i)
{
        var c = {initialization to an instance - e.g. Child1(), Child2(), Child3()..};
        if (c is Child1){
            ((Child1)c).DomeSomethingSpecificForChild1(i);
        }
}
于 2012-06-21T09:34:46.890 に答える