簡體   English   中英

當所有子類都具有相同的基類(包括新類)時,如何繼承多個子類?

[英]How to inherit multiple partial classes when all have the same base class (including the new class)?

所以我對OOP不太好,有些困惑。 如果我已經有來自FruitHandler庫的FruitHandlers類,則看起來像這樣:

public partial class AppleCleaner : FruitHandler {

    public AppleCleaner(int fruitSize) {
        CleanApple(fruitSize);
    }

    void CleanApple(int size) {
        //code to clean an apple;
    }
}

public partial class PearCleaner : FruitHandler {

    public PearCleaner(int fruitSize) {
        CleanPear(fruitSize);
    }

    void CleanPear(int size) {
        //code to clean a pear;
    }
}

public partial class BananaCleaner : FruitHandler {

    public BananaCleaner(int fruitSize) {
        CleanBanana(fruitSize);
    }

    void CleanBanana(int size) {
        //code to clean a banana;
    }
}

我想創建一個類,該類也具有FruitHandler基類,但能夠使用看起來像這樣的CleanApple,CleanPear或CleanBanana:

public partial class FruitEater : FruitHandler {

    public FruitEater(Fruit fruit) {
        if (fruit.Name == "Apple") {
            CleanApple(fruit.size);
        } else if (fruit.Name == "Pear") {
            CleanPear(fruit.size);
        } else if (fruit.Name == "Banana") {
            CleanBanana(fruit.size);
        }

        EatFruit(fruit);
    }

    void EatFruit(Fruit fruit) {
        // eat it;
    }
}

我可以很自由地重構它們,但需要注意的是,所有它們的基類必須是一個FruitHandler(因為在現實生活中,這些都是Forms,而基類必須是Form)。

您可以執行以下操作:

interface IFruitCleaner {
    void Clean(int size)
}

public partial class AppleCleaner : FruitHandler, IFruitCleaner {

    public AppleCleaner(int fruitSize) {
        Clean(fruitSize);
    }

    void Clean(int size) {
        //code to clean an apple;
    }
}


public partial class FruitEater : FruitHandler {

    public FruitEater(Fruit fruit, IFruitCleaner cleaner) {
        cleaner.Clean(fruit.size);
        EatFruit(fruit);
    }

    void EatFruit(Fruit fruit) {
        // eat it;
    }
}

似乎您想將水果傳遞給AppleCleaner ,而不只是大小,但我將其保留給您。

您應該為此使用接口。 除非每個類都將在其基類中執行代碼(在這里不是這種情況),否則應使用接口定義各類的通用方法:

public interface IFruit {
    void Clean(int Size);
}

public partial class AppleCleaner : IFruit, FruitHandler {

    public AppleCleaner(int fruitSize) {
        Clean(fruitSize);
    }

    void Clean(int size) {
        //code to clean an apple;
    }
}

public partial class PearCleaner : IFruit, FruitHandler {

    public PearCleaner(int fruitSize) {
        Clean(fruitSize);
    }

    void Clean(int size) {
        //code to clean a pear;
    }
}

public partial class BananaCleaner : IFruit, FruitHandler {

    public BananaCleaner(int fruitSize) {
        Clean(fruitSize);
    }

    void Clean(int size) {
        //code to clean a banana;
    }
}

這也大大簡化了FruitEater類:

public partial class FruitEater : FruitHandler {

    public FruitEater(IFruit fruit, int size) {
        fruit.Clean(size);
        EatFruit(fruit);
    }

    void EatFruit(IFruit fruit) {
        // eat it;
    }
}

通常,您會把基類放在干凈的位置,但是正如您在實際示例中所說的那樣,它可以使用接口。

public interface IFruitCleaner  {
   void Clean(int size);
}

public partial class AppleCleaner : FruitHandler, IFruitCleaner
{

    public AppleCleaner(int fruitSize)
    {
        Clean(fruitSize);
    }

    void Clean(int size)
    {
        //code to clean an apple;
    }
}

public partial class PearCleaner : FruitHandler, IFruitCleaner
{

    public PearCleaner(int fruitSize)
    {
        Clean(fruitSize);
    }

    void Clean(int size)
    {
        //code to clean a pear;
    }
}


public partial class BananaCleaner : FruitHandler, IFruitCleaner
{

    public BananaCleaner(int fruitSize)
    {
        Clean(fruitSize);
    }

    void Clean(int size)
    {
        //code to clean a banana;
    }
}

暫無
暫無

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

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