[英]OOP convert child to parent and back
我有一個關於 OOP 的一般性問題我在程序中找到了以下代碼(作為示例顯示)。 這里需要一個父 class 作為參數,但是傳遞了一個子,然后從父類型轉換回子類型 我是認為這種來回轉換是否違反 OOP 規則的人?
private void OnSend (BaseParameters obj) {
var request = commandBuilder.BuildCommand (obj);
_controller.ReceiveRequest (request);
}
public BaseCommand BuildCommand (BaseParameters parameters) {
switch (parameters) {
case ParametersCopy parametersCopy: //Give a base parameter and cast to spezific child parameter
{
return = new CommandCopy (parameters.XY.parameters.ZX)
}
case ParametersDelete parametersDelete:
{
return new CommandDelete (parameters.XY.parameters.ZX);
}
}
}
//Await a Base command but a child command is passed
public void ReceiveRequest (BaseCommand cmd) {
CommandQueue.AddCmd (cmd);
}
public void ReceiveEndlessRequest (BaseCommand cmd, CancellationToken cancellationToken) {
while (!cancellationToken.IsCancellationRequested) {
var newPram = cmd.Clone ();
ReceiveRequest (newPram);
}
}
這段代碼仍然有效,因為 C# 只給 object 一個 refrenze。 因此,您可以將它們從父 co 孩子轉換回來。
我的問題是,如果我在“ReviceRequest”中給出一個純基本命令,我的應用程序就會崩潰,因為內部使用了特定的命令
我的“ReviceEndlessRequest”function 不再工作了。 由於復制是在基本類型上執行的,因此所有子屬性都將丟失。 但是由於“ReviceRequest”需要基本類型,所以一切似乎都很好。 但是應用程序支持它,因為缺少參數。
在我看來,這違反了 OOP 規則。 我期望一個 BaseType 並且應用程序在內部使用 childType
在我看來,在 BuildCommand 中轉換參數也是錯誤的。 你怎么看?
只要您首先測試它是否是適當的類型,將基本類型轉換為子類型是完全可以接受的,這就是您示例中的 switch 語句所做的。
如果參數不是已知的子類型,則開關中應該有一個默認情況來處理。
在一個完美的世界中,您可能不需要使用這種模式,因為子類的所有特殊行為都是通過在基礎上定義的多態方法來訪問的。 隨着實際系統的發展,經常發生的情況是您需要一些已知子類類型的特殊行為,但不能更改基本類型。
您在代碼中看到的行為是由於多態性造成的。 如您所知,多態性表明一件事有許多 forms。 因此,在您的情況下, CopyCommand 或 DeleteCommand 是命令的 forms 之一。
BaseCommand 確實會導致錯誤,因為它是一種抽象形式的命令。 它具有由其子類實現的任何抽象方法。
BuildCommand 方法是一種工廠方法,它根據您提供的輸入構造您的命令。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.