簡體   English   中英

C#基礎和2個派生類的初始化

[英]C# Base and 2 Derived Classes initialization

因此,我只想對所有功能使用一個類對象,但我不想直接使用該類,而是需要訪問派生類的成員。

舉個例子:

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

我不想將它們初始化為B objB = new B(),這不是目的,我已經知道這可能是一個解決方案。 我只需要為此使用父類。

謝謝

如果要使用不同的名稱聲明方法,則必須在代碼中實例化顯式類型。

如果所有方法都執行相同的功能,但方式不同,則應從基類中覆蓋該方法,而不要使用其他名稱重新實現該方法。

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

您正在尋找的可能是壓倒一切嗎?

您可以使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
    }
}

不能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();
    }
}

編輯:一種更有效的方法如下所示(它將運行2次強制轉換,而不是4次):

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();
    }
}

在沒有看到您實際的代碼的情況下,我傾向於與其他每個人都表示同意,他們說您應該再次嘗試使用簡單的覆蓋來解決問題。

盡管如此,我還是樂於解決這個問題,並設法編寫了一個無需強制轉換的解決方案。

請享用!

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

    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM