1

したがって、すべての関数に1つのクラスObjectのみを使用したいのですが、そのクラスを直接使用したくないので、派生クラスのメンバーにアクセスする必要があります。

この例を見てください:

class A {
    public A() {

    }

    public void DoSomething() { }
}

class B : A {
    public B() {

    }

    public void DoSomethingBetter() { }
}

class C : A {
    public C() {

    }

    public void DoSomethingBest() { }
}

class Runner {
    public static void Main(String[] args) {
        A objB = new B();
        objB.DoSomethingBetter(); //Won't compile

        A objC = new C();
        objC.DoSomethingBest(); //Won't compile
    }
}

私はそれらをBobjB= new B()として初期化したくありません。それは目的ではなく、それが解決策になる可能性があることをすでに知っています。これには親クラスを使用する必要があります。

ありがとう

4

4 に答える 4

3

異なる名前でメソッドを宣言する場合は、コードで明示的な型をインスタンス化する必要があります。

メソッドがすべて同じ機能を実行するが、方法が異なる場合は、別の名前でメソッドを再実装するのではなく、基本クラスからメソッドをオーバーライドする必要があります。

public class A
{
    public virtual void DoSomething()
    {
         // some implementation
    }
}

public class B : A
{
    public override void DoSomething()
    {
        // body of DoSomethingBetter
    }
}

public class C : A
{
    public override void DoSomething()
    {
        // body of DomSomethingBest
    }
}

アプリケーションの本体は次のように単純化されます。

A b = new B();
A c = new C();

b.DoSomething() // uses logic of DoSomethingBetter
c.DoSomething() // uses logic of DoSomethingBest
于 2012-11-20T20:25:22.857 に答える
1

あなたが探しているのはおそらくオーバーライドですか?

Aクラスを抽象化し、その中のメソッドも作成できます。次に、実際の実装を派生クラスに配置します。

abstract class A {

    public A() {
    }

    public abstract void DoSomething() { }
}

class B : A {

    public B() {
    }

    public override void DoSomething() { }
}

class C : A {

    public C() {
    }

    public override void DoSomething() { }
}

class Runner {
    public static void Main(String[] args) {
        A objB = new B();
        objB.DoSomething(); // Uses the B implementation

        A objC = new C();
        objC.DoSomething(); // Uses the C implementation
    }
}
于 2012-11-20T20:27:36.060 に答える
1

何を達成しようとしているのか100%確実ではありませんが、他の人が提案したように何らかの理由でオーバーライドしたくない場合は、これがオプションです。

class A {
    public A() {

    }

    public void DoSomething() { }
}

class B : A {
    public B() {

    }

    public void DoSomethingBetter() { }
}

class C : A {
    public C() {

    }

    public void DoSomethingBest() { }
}

class Runner {
    public static void Main(String[] args) {
        A objB = new B();
        if (objB is B)
            ((B)objB).DoSomethingBetter();

        A objC = new C();
        if (objC is C) 
            ((C)objC).DoSomethingBest();
    }
}

編集:これを行うためのより効率的な方法は次のとおりです(4つではなく2つのキャストを実行します):

class A {
    public A() {

    }

    public void DoSomething() { }
}

class B : A {
    public B() {

    }

    public void DoSomethingBetter() { }
}

class C : A {
    public C() {

    }

    public void DoSomethingBest() { }
}

class Runner {
    public static void Main(String[] args) {
        A objB = new B();
        B objAB = objB as B;
        if (objAB != null)
            objAB.DoSomethingBetter();

        A objC = new C();
        C objAC = objC AS C;
        if (objAC != null) 
            objAC.DoSomethingBest();
    }
}
于 2012-11-20T20:38:29.957 に答える
0

実際のコードを見ずに、単純なオーバーライドを使用して問題を修正するために本当に再試行する必要があると言っている他のすべての人に同意する傾向があります。

それでも、私はこの問題をいじくり回して楽しんで、キャストを行わないソリューションを作成することができました。

楽しみ!

public class BattlePlan
{
    public Action<Puppy> ExecutePuppyAttack { get; set; }
    public Action<Pigeon> ExecutePigeonAttack { get; set; }
}

public abstract class Animal
{
    public abstract void Attack(BattlePlan battlePlan);
}

public class Puppy : Animal
{
    public void Bite(bool barkFirst)
    {
        // optionally bark at the intruder,
        // then bite as deeply as needed.
    }

    public override void Attack(BattlePlan battlePlan)
    {
        battlePlan.ExecutePuppyAttack(this);
    }
}

public class Pigeon : Animal
{
    public void Bombard(int altitude)
    {
        // ewww. nuff said.
    }

    public override void Attack(BattlePlan battlePlan)
    {
        battlePlan.ExecutePigeonAttack(this);
    }
}


public class EvilMasterMind
{
    private bool _puppiesMustBark = true;
    private int _pigeonAltitude = 100;

    public void Attack()
    {
        var battlePlan = new BattlePlan
        {
            ExecutePuppyAttack = e => e.Bite(_puppiesMustBark),
            ExecutePigeonAttack = e => e.Bombard(_pigeonAltitude)
        };

        var animals = new List<Animal>
        {
            new Puppy(),
            new Pigeon()
        };

        foreach (var animal in animals)
        {
            animal.Attack(battlePlan);
        }

    }
}
于 2012-11-20T22:53:52.183 に答える