我需要一个方法来接受两个类型,并对它们做同样的事情。
我知道我能做到:
public void myMethod(TextView tv, ReadableMap styles) {
if (styles.hasKey("fontFamily")) {
String font = "fonts/" + styles.getString("fontFamily") + ".ttf";
Typeface tf = Typeface.createFromAsset(context.getAssets(), font);
tv.setTypeface(tf);
}
if (styles.hasKey("fontSize")) {
tv.setTextSize(styles.getInt("fontSize"));
}
if (styles.hasKey("letterSpacing")) {
tv.setLetterSpacing(PixelUtil.toPixelFromDIP(styles.getInt("letterSpacing")));
}
}
public void myMethod(TextPaint tv, ReadableMap styles) {
// copy paste the **exact** same code
}
TextView
和TextPaint
都有setTypeface(Typeface)
、setTextSize(float)
和setLetterSpacing(float)
方法,但除了Object
之外,这两个类没有共享的超类型。(请注意,TextPaint
继承了Paint
的方法。)这两个类都使用相同的名称和签名分别声明这些方法。
因此,既然我不能相互转换,我想知道如何减少重复代码的数量?
发布于 2018-08-03 08:13:53
创建一个共享公共方法签名setTypeFace
、setTextSize
、setLetterSpacing
的接口类。(基本上是Adapter模式。)
public interface MyInterface {
Typeface setTypeface(Typeface typeface);
void setTextSize (float textSize);
void setLetterSpacing(float letterSpacing);
}
将myMethod签名重新定义为
public void myMethod (MyInterface myi, ReadableMap styles) {
//...change all your 'tv' references to myi
}
然后用匿名类调用
// myTextView is in scope here...
myMethod(new MyInterface() {
// partial implementation
Typeface setTypeface(Typeface typeface) {
myTextView.setTypeface(typeface);
}, myStyles);
}
// myTextPaint is in scope here
myMethod(new MyInterface() {
// partial implementation
Typeface setTypeface(Typeface typeface) {
myTextPaint.setTypeface(typeface);
}, myStyles);
}
或者为TextView和TextPaint创建实现MyInterface的包装器类。
发布于 2018-08-03 10:59:59
这个怎么样?
public void myMethod(TextView tv, String styles, TextPaint tp) {
//must tv == null -> tp != null or tv != null -> tp == null
if(tv != null){
tp = tv.getPaint();
}
//doSomthing
}
https://stackoverflow.com/questions/51663461
复制相似问题