PCDVD數位科技討論區

PCDVD數位科技討論區 (https://www.pcdvd.com.tw/index.php)
-   七嘴八舌異言堂 (https://www.pcdvd.com.tw/forumdisplay.php?f=12)
-   -   [程式設計問題???] 不同的SubObject該如何自動正確轉換?Mutil-Thread怎麼用 (https://www.pcdvd.com.tw/showthread.php?t=1065147)

公不 2014-12-04 08:00 PM

[程式設計問題???] 不同的SubObject該如何自動正確轉換?Mutil-Thread怎麼用
 
請問一下
我的 Code在此
https://gist.github.com/anonymous/a1f0829695e7872a38de
________________________
我有一個Object

然後有10個SubObject繼承自Object

基本的String都是定義在Object內

而SubObject也有自己特殊的String

現在我利用Object定義的方法

一次獲取這10個SubObject

然後要在UI上面顯示這10個SubObject的資料

現在我的問題卡在

如果SubObject的String已經在Object已經定義的話

那我可以直接取得

可是如果是個別SubObject的自定義特殊String

那我變成需要 {轉換型別}-------SubObject之間無法轉換

才可以取得

請問我有辦法不用轉換型別直接取值嗎?

因為

我是這樣產生SubObject

Object detials = (Object) Result.info;
Object inst = null;
if (detials.mType.equals("GGININ")&&
detials.mSubType.equals("Der")) {
inst = new SubObject();
}

然後取得SubObject的自定義特殊String

我目前是這樣

Object mObject = mObjectlist.get(position);

SubObject tSubObject = (SubObject) mObject;
tSubObject .String;

因為SubObject之間無法轉換

所以型別錯誤的話

會讓APP掛點

有辦法做到自動轉換

好讓我取值嗎?

---------------------
另外的問題

在之前提到的多Thread

在上面的Code 裡面每一個SubObject都有各自的GetCommand

所以我只要呼叫

getValue()就可以

可是

如果我在new thread中用for迴圈一次呼叫全部的SubObject跑getValue()

APP就會出現thread錯誤造成crash

請問該如何改?


謝謝

hui0312 2014-12-04 11:21 PM

你列的有點亂, 我也沒有看的很清處, 我 C# 不好....我用 C++ 舉例

你要不轉型成繼承的型態來取值, 你 base 的 class 就要有對應的 virtual function

for example

class base_parent
{
public:
virtual string get_str_from_id( int id ) = 0;
}

class child : base_parent
{
virtual string get_str_from_id( int id ) { return str[ id ]; }
}

thread crash 的話, 要是你沒有在 thread 中 write data 的話, 通常邏輯在爛也不會 crash, 因為是 thread safe 的.

要是有 write 動作, 你就要想好先後關系, 然後用 critical section 保護起來...

dino750 2014-12-04 11:50 PM

小弟先在定義上說明,class 是你在寫 public class xxx extends yyy { ... }這部分, object 是你把class 實體化(instantiate)後, xxx object = new xxx();

就小弟對問題的理解,你有一 Class 繼承 SuperClass,你要有 SuperClass的型態,但又要用到Class的功能.你可以寫 SuperClass object = new Class();當你需要Class的功能時,你可以轉換 ((Class)object).classFunction();

能不能轉換要看當初實體化的class是哪一個,subclass的實體可轉換到superClass, superClass的實體不可轉換到subclass.

silent 2014-12-05 12:16 AM

不懂,但感覺跟reflection好像有關係。

公不 2014-12-05 01:24 AM



應該說

有一個A class裡面定義了基本款的結構資訊

然後B跟C都是繼承A產生的

所以A有的B跟C都有

但是B跟C另外自己也各自定義了YYYY這專屬B 跟 XXXXX 專屬C的結構

一般操作時都是用 B跟C 來存放資料與操作

但因為B與C都是繼承自A

所以在基本資料上可藉由{型別轉換}來達成存取基本資料的動作

那我目前問題在於

我要 {動態}的使用

因此有時候是拿到B

有時候拿到C

這時候雖說都可以透過型別轉換暫時到A

可是因為A裡面沒有定義YYYY 與 XXXXX

所以我沒辦法存取這2個部分

那現在變成我程式要寫寫死

否則就會

型別轉換錯誤

或是

無法存取我要的結構

請問有辦法解決嗎 ?

謝謝

darkangel 2014-12-05 01:53 AM

把 xxxx 跟 yyyy 搞一個 class xy,把 obj xy 傳給 obj a 來操作 xxxx 跟 yyyy。
這樣連型別轉換都不用了。

Adsmt 2014-12-05 02:10 AM

樓主要實作的應該是 OOP 第三大絕:「多型」吧?

C# 使用 virtual method 就可以了。

請參考這裡....
http://msdn.microsoft.com/zh-tw/library/ms173152.aspx

T磨人 2014-12-05 09:34 AM

我如果有相同需求 我會用 定義 interface 和 reflect 方式來實做 相關的 code.
之前工作分別用過 java/C# 實做過, 確實可行的.

沒 sample code... 我懶得寫 , 僅 提供概念 供參考.

LR2001 2014-12-05 10:07 AM

又到了周末了!

分享一個觀念,別給繼承、衍生等名詞給迷惑住,從實際子物件逆向抽出共同介面,進而設計出父類別,將資料封裝,以父類別介面寫程式。

構思一個面面俱到的父類別並不容易,特別是經過多層次繼承,所以盡量扁平化您的類別庫或程式架構。

附帶一提,C 的函式指標,才是我的最愛,結構裡放幾個,想怎麼玩都行。
我信奉,最少的規則,最大的自由,才能發揮無窮的想像力。

公不 2014-12-05 10:39 AM

引用:
作者hui0312
你列的有點亂, 我也沒有看的很清處, 我 C# 不好....我用 C++ 舉例

你要不轉型成繼承的型態來取值, 你 base 的 class 就要有對應的 virtual function

for example

class base_parent
{
public:
virtual string get_str_from_id( int id ) = 0;
}

class child : base_parent
{
virtual string get_str_from_id( int id ) { return str[ id ]; }
}

thread crash 的話, 要是你沒有在 thread 中 write data 的話, 通常邏輯在爛也不會 crash, 因為是 thread safe 的.

要是有 write 動作, 你就要想好先後關系, 然後用 critical section 保護起來...


引用:
作者darkangel
把 xxxx 跟 yyyy 搞一個 class xy,把 obj xy 傳給 obj a 來操作 xxxx 跟 yyyy。
這樣連型別轉換都不用了。


引用:
作者Adsmt
樓主要實作的應該是 OOP 第三大絕:「多型」吧?

C# 使用 virtual method 就可以了。

請參考這裡....
http://msdn.microsoft.com/zh-tw/library/ms173152.aspx


引用:
作者T磨人
我如果有相同需求 我會用 定義 interface 和 reflect 方式來實做 相關的 code.
之前工作分別用過 java/C# 實做過, 確實可行的.

沒 sample code... 我懶得寫 , 僅 提供概念 供參考.




請問您的意思是這樣嗎 ?

OOP ?

interface 和 reflect 是 ?

我理解的意思是這樣

以下是我的code

PS. 是Java 的

https://gist.github.com/anonymous/5646bb920506cf9d8e19


所有的時間均為GMT +8。 現在的時間是08:32 PM.

vBulletin Version 3.0.1
powered_by_vbulletin 2025。