[英]If a partial class inherits from a class then all other partial classes with the same name should also inherit the same base class?
[英]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.