CLion教程-拉成员上移,推成员下移
拉成员上移重构允许您将类成员移动到基类。
推成员下移重构可帮助您通过将类成员移动到子类来清理类层次结构。然后这些成员仅会被移动到直接的子类中。
拉成员上移
- 选择要移动到超类的成员。
- 在主菜单或上下文菜单中,选择重构 | 拉成员上移。拉成员上移对话框会出现。
- 选择目标对象(超类)。
- 在成员部分中,选择要移动的成员。
- 单击“重构”以将选定的成员拉到目标位置。
示例
C++
之前 | 之后 |
---|---|
class BaseClass { int d1 = 0; static const int d2 = 1; void exFunc(int); //This method will be pushed down }; class ChildClass: public BaseClass { char SomeChar = 'a'; long d22; }; void BaseClass::exFunc(int) {}; | class BaseClass { int d1 = 0; }; class ChildClass: public BaseClass { char SomeChar = 'a'; long d22; static const int d2 = 1; void exFunc(int); }; void ChildClass::exFunc(int) {}; |
Objective-C/C++
之前 | 之后 |
---|---|
@interface SampleClass:NSObject /* This method will be pulled up */ - (int)IntSum:(int)num1 andNum2:(int)num2; @end @implementation SampleClass - (int)IntSum:(int)num1 andNum2:(int)num2 { int result = num1 = num2; return result; } @end | @interface BaseClass : NSObject - (int)IntSum:(int)num1 andNum2:(int)num2; @end @interface SampleClass : BaseClass @end @implementation BaseClass - (int)IntSum:(int)num1 andNum2:(int)num2 { int result = num1 = num2; return result; } @end |
Python
之前 | 之后 |
---|---|
class SuperClass: def super_method(self): pass class SubClassOne(SuperClass): # This function will be pulled up def my_method(self): pass | class SuperClass: def super_method(self): pass def my_method(self): pass class SubClassOne(SuperClass): pass |
上移依赖成员
让我们考虑以下C++代码示例:
class BaseClass {
int a = 0;
};
class ChildClass : BaseClass {
int b1 = 12;
int b2 = b1 * 4;
};
正如您所见,变量b2
在这里取决于变量b1
。如果您对ChildClass
类应用拉成员上移重构,并尝试选择要移动的b2
,并保留b1
在类中,CLion会在拉成员上移对话框中突出显示有问题的成员,如下所示:
尝试继续进行重构,您将收到以下警告消息:
选择“Continue”以忽略问题并继续进行重构,或选择“Cancel”以返回并解决问题。您还可以在Find工具窗口中观察到冲突。
推成员下移
- 在编辑器中,打开需要下移成员的类。
- 在主菜单或上下文菜单中,选择重构 | 推成员下移。推成员下移对话框会显示要下移的成员列表。
- 在“要下移的成员”区域中,选择要移动的成员。请注意,插入符号处的成员已被选中。
如果下移成员可能会导致问题,您将看到红色的突出显示。这意味着,如果不处理这种情况,重构后会出现错误。CLion会在“检测到问题”对话框中提示您,您可以选择忽略或修复问题。 - 预览并应用更改。
示例
C++
之前 | 之后 |
---|---|
class BaseClass {<br/> int d1 = 0;<br/> static const int d2 = 1;<br/> void exFunc(int); //This method will be pushed down<br/>};<br/><br/>class ChildClass: public BaseClass {<br/> char SomeChar = 'a';<br/> long d22;<br/>};<br/><br/>void BaseClass::exFunc(int) {}; | class BaseClass {<br/> int d1 = 0;<br/>};<br/><br/>class ChildClass: public BaseClass {<br/> char SomeChar = 'a';<br/> long d22;<br/> static const int d2 = 1;<br/> void exFunc(int);<br/>};<br/><br/>void ChildClass::exFunc(int) {}; |
Objective-C/C++
之前 | 之后 |
---|---|
@interface Superclass : NSObject {<br/> int v;<br/> int w; //This variable will be pushed down<br/>}<br/>- (void)initV;<br/>@end<br/><br/>@implementation Superclass<br/>- (void)initV {<br/> v = 20;<br/>}<br/>@end<br/><br/>@interface Subclass : Superclass | @interface Superclass : NSObject {<br/> int v;<br/>}<br/>- (void)initV;<br/>@end<br/><br/>@implementation Superclass<br/>- (void)initV {<br/> v = 20;<br/>}<br/>@end<br/><br/>@interface Subclass : Superclass { int w; } |
Python
之前 | 之后 |
---|---|
class SuperClass:<br/> # This function will be pushed down<br/> def super_method(self):<br/> pass<br/><br/>class SubClassOne(SuperClass):<br/> def my_method(self):<br/> pass<br/><br/>class SubClassTwo(SuperClass):<br/> def my_method(self):<br/> pass | class SuperClass:<br/>pass<br/><br/>class SubClassOne(SuperClass):<br/> def my_method(self):<br/> pass<br/><br/>def super_method(self):<br/> pass<br/><br/>class SubClassTwo(SuperClass):<br/> def my_method(self):<br/> pass<br/><br/>def super_method(self):<br/> pass |
下移依赖成员
让我们考虑以下C++代码示例:
class SuperClass {
int b1 = 12;
int b2 = b1 * 4;
};
class ChildClass : SuperClass {
int b3 = 11;
};
正如您所见,变量b2
在这里取决于变量b1
。如果您对上述类应用推成员下移重构,并尝试选择要移动的b1
,并保留b2
在基类中,CLion会在推成员下移对话框中突出显示有问题的成员,如下所示:
尝试继续进行重构,您将收到以下警告消息:
选择“Continue”以忽略问题并继续进行重构,或选择“Cancel”以返回并解决问题。您还可以在Find工具窗口中观察到冲突。