的情況區別實現接口的對象的實例,是,我有這個接口:通過枚舉值或通過其實現接口
interface ISymbol
{
}
和這些類:
class Letter implements ISymbol
{
}
class Number implements ISymbol
{
}
class LowerCaseLetter extends Letter
{
}
class UpperCaseLetter extends Letter
{
}
現在讓我們說我有這個功能,在不同的課堂上。 該類執行不會在ISymbol 類的實現所屬的邏輯:
class SymbolMonitor
{
void func(ISymbol[] symbols)
{
for (ISymbol iSymbol : symbols)
{
// If the symbol is a number
// or a lower case letter do something.
}
}
}
但我不想專門檢查這兩種類型,因爲我可能有ISymbol的其他執行類,將也需要相同的邏輯。
我的問題是關於首選的行動方式。 我有兩個解決問題的方法。 1.像這樣創建:
enum SymbolType
{
NORMAL,
SPECIAL1,
SPECIAL2,
}
,並添加到代碼:
interface ISymbol
{
SymbolType getType();
}
class SymbolMonitor
{
void func(ISymbol[] symbols)
{
for (ISymbol iSymbol : symbols)
{
if(iSymbol.getType().equals(SymbolType.SPECIAL1))
{
// Do special1 logic
}
if(iSymbol.getType().equals(SymbolType.SPECIAL2))
{
// Do special2 logic
}
}
}
}
我可以創建空的接口,並使用instanceof功能。
interface ISpecialSymbol1
{
}
ISpecialSymbol2 {
}
類LowerCaseLetter延伸信接口實現ISpecialSymbol1 {
}
類Number實現ISymbol,ISpecialSymbol1 {
}
,這樣函數將是:
class SymbolMonitor
{
void func(ISymbol[] symbols)
{
for (ISymbol iSymbol : symbols)
{
if(iSymbol instanceof ISpecialSymbol1)
{
// Do special 1 logic.
}
if(iSymbol instanceof ISpecialSymbol2)
{
// Do special 2 logic.
}
}
}
}
我認爲第二個選項是更簡單,但我是java的新手,我不確定什麼是正確的使用方法。
使用多態對你有利。儘量避免'instanceof'並輸入檢查。 –
你的意思是把邏輯推入課堂?因爲我有一個使用ISymbol的外部函數,而不是屬於類內部的邏輯。 – TomF
有許多模式可以實現這種間接性。 「訪客」可能就是其中之一。一探究竟。 –