Activity

说明: Activity基类

  1. 让子类方便的获取tag
  2. 让子类方便的getActvity
  3. 默认设置竖屏锁定
  4. 模版方法模式让子类可以方便的进行数据填充代码编写
  5. findView让子类省去findViewByid的强转,更方便的获取xml组件
  6. showLoading和hideLoading可以方便的进行loading弹出
package com.zhiup.base.base;import android.app.Activity;
import android.content.DialogInterface;
import android.content.pm.ActivityInfo;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.WindowManager;import com.umeng.analytics.MobclickAgent;
import com.zhiup.base.R;
import com.zhiup.base.bus.GoToLoginBus;
import com.zhiup.base.utils.RxBus;
import com.zhiup.base.view.dialog.DialogBuilder;
import com.zhiup.base.view.loading.LoadingDialog;/*** Created by 63453 on 2017/8/11.*/public abstract class BaseActivity extends AppCompatActivity {public String getTag(){return getClass().getName();}//为了每个Activity打日志public Activity getActivity(){return this;}private LoadingDialog mLoadingDialog;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//设置竖屏锁定init();}protected void onResume() {super.onResume();MobclickAgent.onResume(this);}protected void onPause() {super.onPause();MobclickAgent.onPause(this);
//        MobclickAgent.setCatchUncaughtExceptions(false);}protected abstract int getLayoutId();//本activity的layoutIDprotected abstract void initView();//初始化viewprotected abstract void initData();//初始化View的数据protected abstract void initEvent();//初始化事件点击protected void initPresenter(){}//初始化presenterprivate final void init(){setContentView(getLayoutId());initTitle();initView();initData();initPresenter();initEvent();}protected void initTitle(){}/*** 利用泛型直接获取View 外面无需强制转换* @param id  传入view的ID* @param <T>* @return*/@SuppressWarnings("unchecked")protected <T extends View>T findView(int id){return (T)findViewById(id);}public synchronized void showLoading(Activity act) {if (mLoadingDialog == null) {mLoadingDialog = new LoadingDialog(act);mLoadingDialog.setCanceledOnTouchOutside(false);}if (!mLoadingDialog.isShowing() && !act.isFinishing() && !act.isDestroyed()) {mLoadingDialog.show();}}public synchronized void hideLoading(Activity act) {if (mLoadingDialog != null && mLoadingDialog.isShowing() && !act.isFinishing() && !act.isDestroyed()) {mLoadingDialog.dismiss();mLoadingDialog=null;}}
}复制代码

BaseActivityListView

说明: MVP模式中 带list的Activity的View基类 BaseActivityListView

package com.zhiup.base.base;/*** Created by zhou on 2017/12/22.*/public interface BaseActivityListView extends BaseActivityView{void showLoading();void showDataNull();void showNetError();void hiddenPrompt();void hideLoading();
}
复制代码

BaseActivityView

说明: MVP模式中Activity的view基类

package com.zhiup.base.base;import android.app.Activity;/*** Created by zhou on 2017/8/17 17:50 .*/public interface BaseActivityView {Activity getActivity();
}
复制代码

BaseApplication

说明: 主程序中Application基类

package com.zhiup.base.base;import android.app.ActivityManager;
import android.app.Application;
import android.content.Context;
import android.os.Handler;import com.zhiup.base.utils.LogUtils;/*** Created by zhou on 2017/8/25 15:41 .* 应用程序基本Application*/public abstract class BaseApplication extends Application{private Handler mDelivery;//拥有主线程的Handler,主要做主线程处理分发private static BaseApplication gInstance;public static final BaseApplication getInstance(){if(gInstance==null) throw new RuntimeException();return gInstance;}public void runOnMainThread(Runnable runnable,long delayTime){mDelivery.postDelayed(runnable,delayTime);}@Overridepublic void onCreate() {super.onCreate();this.gInstance = this;mDelivery = new Handler(getMainLooper());initLog();if(isMainProcess()){//主进程执行此方法onMainProc();//留给子类执行initComponent();//父类第三方组件初始化动作}}/*** 初始化组件.*/private void initComponent(){}//只有主进程才执行此方法,其他进程不执行.增加app启动速度,减少Application内存cpu等消耗public abstract void onMainProc();/*** 获取当前进程名*/private String getCurrentProcessName() {int pid = android.os.Process.myPid();String processName = "";ActivityManager manager = (ActivityManager) getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE);for (ActivityManager.RunningAppProcessInfo process : manager.getRunningAppProcesses()) {if (process.pid == pid) {processName = process.processName;}}return processName;}/*** 包名判断是否为主进程** @param* @return*/public boolean isMainProcess() {return getApplicationContext().getPackageName().equals(getCurrentProcessName());}/*** 初始化Log日志打印*/public void initLog() {LogUtils.Config config = LogUtils.getConfig().setLogSwitch(true)// 设置log总开关,包括输出到控制台和文件,默认开.setConsoleSwitch(true)// 设置是否输出到控制台开关,默认开.setGlobalTag(null)// 设置log全局标签,默认为空// 当全局标签不为空时,我们输出的log全部为该tag,// 为空时,如果传入的tag为空那就显示类名,否则显示tag.setLogHeadSwitch(true)// 设置log头信息开关,默认为开.setLog2FileSwitch(false)// 打印log时是否存到文件的开关,默认关.setDir("")// 当自定义路径为空时,写入应用的/cache/log/目录中.setFilePrefix("")// 当文件前缀为空时,默认为"util",即写入文件为"util-MM-dd.txt".setBorderSwitch(true)// 输出日志是否带边框开关,默认开.setConsoleFilter(LogUtils.V)// log的控制台过滤器,和logcat过滤器同理,默认Verbose.setFileFilter(LogUtils.V)// log文件过滤器,和logcat过滤器同理,默认Verbose.setStackDeep(1);// log栈深度,默认为1LogUtils.d(config.toString());}
}复制代码

BaseBean

说明: BaseBean基类用于混淆配置,Serializable可以去掉 kotlin代码编写

package com.zhiup.base.base;import java.io.Serializable/*** Created by zhou on 2017/12/19.*/interface BaseBean:Serializable{
}复制代码

BaseDialogFragment

说明: dialog基类

package com.zhiup.base.base;import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.DialogFragment;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;import com.blankj.utilcode.util.ScreenUtils;/*** Created by zhou on 2017/12/7.*/public abstract class BaseDialogFragment extends DialogFragment {private View mView;protected int mScreenWidth = ScreenUtils.getScreenWidth();@Nullable@Overridepublic View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE);Window window = getDialog().getWindow();window.setGravity(setGravity());window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));mView = inflater.inflate(getLayoutId(), container,false);init();return mView;}@Overridepublic void onStart() {super.onStart();getDialog().getWindow().setLayout((int)getDialogWidth(), ViewGroup.LayoutParams.WRAP_CONTENT);}private void init(){initView();initData();initEvent();}protected abstract int getLayoutId();protected abstract void initView();protected abstract void initData();protected abstract void initEvent();public View getmView(){return mView;}protected float getDialogWidth(){return mScreenWidth;}protected int setGravity() {return Gravity.CENTER;}
}复制代码

BaseFragment

说明:Fraagment基类

package com.zhiup.base.base;import android.app.Activity;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;import com.zhiup.base.view.loading.LoadingDialog;/*** Created by zhou on 2017/11/7 17:30 .*/public abstract class BaseFragment extends Fragment {private LoadingDialog mLoadingDialog;@Nullable@Overridepublic View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {View v = inflater.inflate(getLayoutId(),container,false);initTitle(v);return v;}@Overridepublic void onActivityCreated(@Nullable Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);init();initData();initEvent();}public abstract int getLayoutId();public abstract void init();public void initTitle(View v){}public abstract void initEvent();public abstract void initData();public void showLoading() {showLoading(getActivity());}public void hideLoading() {hideLoading(getActivity());}/*** 利用泛型直接获取View 外面无需强制转换* @param id  传入view的ID* @param <T>* @return*/@SuppressWarnings("unchecked")protected <T extends View>T findView(int id){return (T) getView().findViewById(id);}public synchronized void showLoading(Activity act) {if (mLoadingDialog == null) {mLoadingDialog = new LoadingDialog(act);mLoadingDialog.setCanceledOnTouchOutside(false);}if (!mLoadingDialog.isShowing() && !act.isFinishing() && !act.isDestroyed()) {mLoadingDialog.show();}}public synchronized void hideLoading(Activity act) {if (mLoadingDialog != null && mLoadingDialog.isShowing() && !act.isFinishing() && !act.isDestroyed()) {mLoadingDialog.dismiss();mLoadingDialog=null;}}}复制代码

BaseFragmentView

说明:MVP模式中Fragment的view基类

package com.zhiup.base.base;import android.content.Context;/*** Created by zhou on 2017/8/17 17:50 .*/public interface BaseFragmentView {Context getContext();
}复制代码

BaseInputMethodActivity

说明:

package com.zhiup.base.base;import android.content.Context;
import android.graphics.Rect;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;import com.zhiup.base.utils.LogUtils;/*** Created by zhou on 2017/11/15 10:31 .*/public abstract class BaseInputMethodActivity extends BaseActivity{@Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {if (ev.getAction() == MotionEvent.ACTION_DOWN) {View v = getCurrentFocus();if (isShouldHideKeyboard(v, ev)) {InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);imm.hideSoftInputFromWindow(v.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);}}return super.dispatchTouchEvent(ev);}// 根据EditText所在坐标和用户点击的坐标相对比,来判断是否隐藏键盘private boolean isShouldHideKeyboard(View v, MotionEvent event) {if (v != null && (v instanceof EditText)) {int[] l = {0, 0};v.getLocationInWindow(l);int left = l[0],top = l[1],bottom = top + v.getHeight(),right = left + v.getWidth();return !(event.getX() > left && event.getX() < right&& event.getY() > top && event.getY() < bottom);}return false;}private boolean isKeyboardShown(View rootView) {final int softKeyboardHeight = 100;Rect frame = new Rect();rootView.getWindowVisibleDisplayFrame(frame);DisplayMetrics dm = rootView.getResources().getDisplayMetrics();int heightDiff = rootView.getBottom() - frame.bottom;LogUtils.d("" + rootView.getBottom() + ", " + frame.bottom + ", " + heightDiff);return heightDiff > softKeyboardHeight * dm.density;}
}复制代码

BaseLazyFragment

说明:

package com.zhiup.base.base;import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.View;/*** Created by zhou on 2017/11/7 17:30 .*/public abstract class BaseLazyFragment extends BasePermissionFragment {/*** 控件是否初始化完成*/private boolean isViewCreated;/*** 数据是否已加载完毕*/private boolean isLoadDataCompleted;@Overridepublic void setUserVisibleHint(boolean isVisibleToUser) {super.setUserVisibleHint(isVisibleToUser);if (isVisibleToUser && isViewCreated && !isLoadDataCompleted) {isLoadDataCompleted = true;inVisiableLoad();}}@Overridepublic void onViewCreated(View view, @Nullable Bundle savedInstanceState) {super.onViewCreated(view, savedInstanceState);isViewCreated = true;}@Overridepublic void onActivityCreated(@Nullable Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);if (getUserVisibleHint()) {//当前可见则加载,否则由上面的setUserVisibleHint加载数据isLoadDataCompleted = true;inVisiableLoad();}}public abstract void inVisiableLoad();}复制代码

BasePermissionActivity

说明:

package com.zhiup.base.base;import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.widget.Toast;/*** Created by zhou on 2017/9/28.* 用于处理权限的基类 activity*/public abstract class BasePermissionActivity extends BaseActivity{//下面是权限相关代码----------------------------------------!/*** 权限回调Handler*/private PermissionHandler mHandler;/*** 请求权限** @param permissions 权限列表* @param handler     回调*/public void requestPermission(String[] permissions, PermissionHandler handler) {String permissionArr[] = PermissionUtils.hasSelfPermissions(this, permissions);if (permissionArr.length==0) {handler.onGranted();} else {mHandler = handler;ActivityCompat.requestPermissions(this, permissionArr, 1);}}/*** 权限请求结果** @param requestCode* @param permissions* @param grantResults*/@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);if (mHandler == null) return;//        if (PermissionUtils.getTargetSdkVersion(this) < 23 && !PermissionUtils.hasSelfPermissions(this, permissions)) {
//            mHandler.onDenied();
//            return;
//        }if (PermissionUtils.verifyPermissions(grantResults)) {mHandler.onGranted();} else {if (!PermissionUtils.shouldShowRequestPermissionRationale(this, permissions)) {if (!mHandler.onNeverAsk()) {Toast.makeText(this, "权限已被拒绝,请在设置-应用-权限中打开", Toast.LENGTH_SHORT).show();}} else {mHandler.onDenied();}}}
}
复制代码

BasePermissionFragment

说明:

package com.zhiup.base.base;import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.widget.Toast;/*** @author zcz* @date 2017/11/29*/
public abstract class BasePermissionFragment extends BaseFragment {/*** 权限回调Handler*/private PermissionHandler mHandler;/*** 请求权限** @param permissions 权限列表* @param handler     回调*/public void requestPermission(String[] permissions, PermissionHandler handler) {String permissionArr[] = PermissionUtils.hasSelfPermissions(getActivity(), permissions);if (permissionArr.length==0) {handler.onGranted();} else {mHandler = handler;ActivityCompat.requestPermissions(getActivity(), permissionArr, 1);}}/*** 权限请求结果** @param requestCode* @param permissions* @param grantResults*/@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);if (mHandler == null) return;//        if (PermissionUtils.getTargetSdkVersion(this) < 23 && !PermissionUtils.hasSelfPermissions(this, permissions)) {//            mHandler.onDenied();//            return;//        }if (PermissionUtils.verifyPermissions(grantResults)) {mHandler.onGranted();} else {if (!PermissionUtils.shouldShowRequestPermissionRationale(getActivity(), permissions)) {if (!mHandler.onNeverAsk()) {Toast.makeText(getActivity(), "权限已被拒绝,请在设置-应用-权限中打开", Toast.LENGTH_SHORT).show();}} else {mHandler.onDenied();}}}
}复制代码

BasePresenter

说明:

package com.zhiup.base.base;import java.lang.ref.WeakReference;/*** Created by 63453 on 2017/8/12.*/public abstract class BasePresenter<T> {protected WeakReference<T> mView;public BasePresenter(T view){this.mView = new WeakReference<>(view);}public T getView() {return mView.get();}/*** 做销毁时移除数据*/public void onDestroy(){if (mView != null) {mView.clear();
//            mView = null;暂时不能置为空,会引起退出activity时getView空指针}}}复制代码

BaseResult

说明:

package com.zhiup.base.base;/*** Created by zhou on 2017/11/6 12:04 .*/public class BaseResult<T> {public String msg;public int status;public T data;
}复制代码

BaseWidget

说明:

package com.zhiup.base.base;import android.content.Context;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;/*** Created by zhou on 2017/11/23 9:39 .*/public abstract class BaseWidget extends LinearLayout implements BaseWidgetView{private View v;public BaseWidget(Context context) {this(context,null);}public BaseWidget(Context context, @Nullable AttributeSet attrs) {super(context, attrs);init();}protected void init() {v = LayoutInflater.from(getContext()).inflate(getLayoutId(),this,true);initView();initInnerEvent();}public View getView(){return v;}
}复制代码

BaseWidgetView

说明:

package com.zhiup.base.base;/*** Created by zhou on 2017/11/23 9:37 .*/public interface BaseWidgetView {void initView();void initInnerEvent();int getLayoutId();
}复制代码

CommonPagerAdapter

说明:

package com.zhiup.base.base;import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.view.ViewGroup;import java.util.List;public class CommonPagerAdapter extends FragmentPagerAdapter {private List<Fragment> fragments;private Fragment mCurrentFragment;public CommonPagerAdapter(FragmentManager fm, List<Fragment> fragments) {super(fm);this.fragments = fragments;}@Overridepublic Fragment getItem(int arg0) {return (fragments == null || fragments.size() == 0) ? null : fragments.get(arg0);}@Overridepublic int getCount() {return fragments == null ? 0 : fragments.size();}/*** 使用FragmentPagerAdapter时,难免要在Activity和当前显示的Fragment间传递数据。* 但是FragmentPagerAdapter并没有给我们提供类似getCurrentFragment一类的API。* 通过FragmentPagerAdapter源码,发现每次Fragment切换都会调用到FragmentPagerAdapter.setPrimaryItem方法。* 这个方法里把一个Fragment设置为mCurrentPrimaryItem。很明显mCurrentPrimaryItem就是我们想得到的当前Fragment,* 那么我们只需要重载这个方法,把传入的Fragment记录下来即可。** @param container* @param position* @param object*/@Overridepublic void setPrimaryItem(ViewGroup container, int position, Object object) {mCurrentFragment = (Fragment) object;super.setPrimaryItem(container, position, object);}public Fragment getCurrentFragment() {return mCurrentFragment;}}复制代码

PermissionHandler

说明:

package com.zhiup.base.base;/*** 权限回调接口*/
public interface PermissionHandler {/*** 权限通过*/void onGranted();/*** 权限拒绝*/void onDenied();/*** 不再询问** @return 如果要覆盖原有提示则返回true*/boolean onNeverAsk();
}复制代码

PermissionUtils

说明:

package com.zhiup.base.base;import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Build;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.PermissionChecker;
import android.support.v4.util.SimpleArrayMap;import java.util.ArrayList;/*** 权限工具类,引用PermissionsDispatcher中自带* Created by Laiyimin on 2016/8/23.*/
public final class PermissionUtils {// Map of dangerous permissions introduced in later framework versions.// Used to conditionally bypass permission-hold checks on older devices.private static final SimpleArrayMap<String, Integer> MIN_SDK_PERMISSIONS;static {MIN_SDK_PERMISSIONS = new SimpleArrayMap<>(8);MIN_SDK_PERMISSIONS.put("com.android.voicemail.permission.ADD_VOICEMAIL", 14);MIN_SDK_PERMISSIONS.put("android.permission.BODY_SENSORS", 20);MIN_SDK_PERMISSIONS.put("android.permission.READ_CALL_LOG", 16);MIN_SDK_PERMISSIONS.put("android.permission.READ_EXTERNAL_STORAGE", 16);MIN_SDK_PERMISSIONS.put("android.permission.USE_SIP", 9);MIN_SDK_PERMISSIONS.put("android.permission.WRITE_CALL_LOG", 16);MIN_SDK_PERMISSIONS.put("android.permission.SYSTEM_ALERT_WINDOW", 23);MIN_SDK_PERMISSIONS.put("android.permission.WRITE_SETTINGS", 23);}private static volatile int targetSdkVersion = -1;private PermissionUtils() {}/*** Checks all given permissions have been granted.** @param grantResults results* @return returns true if all permissions have been granted.*/public static boolean verifyPermissions(int... grantResults) {if (grantResults.length == 0) {return false;}for (int result : grantResults) {if (result != PackageManager.PERMISSION_GRANTED) {return false;}}return true;}/*** Returns true if the Activity or Fragment has access to all given permissions.** @param context     context* @param permissions permission list* @return returns true if the Activity or Fragment has access to all given permissions.*/public static String[] hasSelfPermissions(Context context, String... permissions) {ArrayList<String> permissionArr = new ArrayList<>();for (String permission : permissions) {if (permissionExists(permission) && !hasSelfPermission(context, permission)) {permissionArr.add(permission);}}return permissionArr.toArray(new String[permissionArr.size()]);}/*** Returns true if the permission exists in this SDK version** @param permission permission* @return returns true if the permission exists in this SDK version*/private static boolean permissionExists(String permission) {// Check if the permission could potentially be missing on this deviceInteger minVersion = MIN_SDK_PERMISSIONS.get(permission);// If null was returned from the above call, there is no need for a device API level check for the permission;// otherwise, we check if its minimum API level requirement is metreturn minVersion == null || Build.VERSION.SDK_INT >= minVersion;}/*** Determine context has access to the given permission.* <p/>* This is a workaround for RuntimeException of Parcel#readException.* For more detail, check this issue https://github.com/hotchemi/PermissionsDispatcher/issues/107** @param context    context* @param permission permission* @return returns true if context has access to the given permission, false otherwise.* @see #hasSelfPermissions(Context, String...)*/private static boolean hasSelfPermission(Context context, String permission) {try {return PermissionChecker.checkSelfPermission(context, permission) == PackageManager.PERMISSION_GRANTED;} catch (RuntimeException t) {return false;}}/*** Checks given permissions are needed to show rationale.** @param activity    activity* @param permissions permission list* @return returns true if one of the permission is needed to show rationale.*/public static boolean shouldShowRequestPermissionRationale(Activity activity, String... permissions) {for (String permission : permissions) {if (ActivityCompat.shouldShowRequestPermissionRationale(activity, permission)) {return true;}}return false;}/*** Get target sdk version.** @param context context* @return target sdk version*/@TargetApi(Build.VERSION_CODES.DONUT)public static int getTargetSdkVersion(Context context) {try {if (targetSdkVersion != -1) {return targetSdkVersion;}PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);targetSdkVersion = packageInfo.applicationInfo.targetSdkVersion;} catch (PackageManager.NameNotFoundException ignored) {}return targetSdkVersion;}}复制代码

转载于:https://juejin.im/post/5b5159306fb9a04fde5ac5aa

私藏的开发过程中的那些基类相关推荐

  1. C++多继承中重写不同基类中相同原型的虚函数

    在C++多继承体系当中,在派生类中可以重写不同基类中的虚函数.下面就是一个例子: class CBaseA  {  public:  virtual void TestA();  };  class ...

  2. C++虚继承中的虚基类表

    虚继承主要解决多重继承会在子类中存在多份拷贝的问题,这不仅浪费空间,而且存在二义性. 在之前的 C++ 继承中已经说过虚继承基本概念,这里不再赘述.这篇文章主要探究虚继承的原理.文章中多处给出了类实例 ...

  3. c++中继承 掩藏基类成员,访问父类对比c#

    这方面看一个代码就可以 代码 //testclass.h #include<stdio.h> classbaseclass{ int a; public: voidcprint(); }; ...

  4. 系统中常用操作基类(SSH项目中)非常非常经典的部分

    package com.css.common.hibernate3; import java.io.Serializable; import java.util.List; import java.u ...

  5. MFC开发过程中,自定义的类中做分割窗口的图像显示,GetDC出现问题:function does not take 0 parameters?

    做MFC分割窗口时,其中含有视类CxxVew窗口,含有General Class (自定义的类CMyXX),在CMyXX中使用GetDC时: CDC* pDC = GetDC(); 出现标题中的问题, ...

  6. C++中的虚继承与虚基类

    1.Cpp中的虚继承与虚基类 在多继承时,很容易产生命名冲突的问题,即使我们很小心地将所有类中的成员变量和成员函数都命名为不同的名字,命名冲突依然有可能发生,比如典型的是菱形继承,如下图所示: 类A派 ...

  7. C++中基类的析构函数为什么要用virtual虚析构函数

    知识背景 要弄明白这个问题,首先要了解下C++中的动态绑定. 关于动态绑定的讲解,请参阅:  C++中的动态类型与动态绑定.虚函数.多态实现 正题 直接的讲,C++中基类采用virtual虚析构函数是 ...

  8. C++中为什么要引入抽象基类和纯虚函数?

    为什么要引入抽象基类和纯虚函数? 主要目的是为了实现一种接口的效果. 抽象类是一种特殊的类,它是为了抽象和设计的目的为建立的,它处于继承层次结构的较上层. ⑴抽象类的定义:带有纯虚函数的类为抽象类. ...

  9. Qt中基类widget的各个事件函数中包含了ignore()的调用

    void My_Label:: mousePressEvent(QMouseEvent* e){qDebug()<<"子控件按下了";// e->ignore() ...

最新文章

  1. python 在windows 中文显示
  2. 【莓闻】2009年黑莓增长显著 智能手机领域第一
  3. 天天象棋 残局闯关 第10关
  4. 【Spring学习】ring的core模块应用详解
  5. 汇编语言之寄存器(CPU工作原理)
  6. Linus 本尊来了!为什么 KubeCon 越来越火?
  7. mysql 漏洞如何修复_Mysql漏洞修复方法思路及注意事项
  8. (12)css—float浮动样式
  9. Intel Sandy Bridge/Ivy Bridge架构/微架构/流水线 (13) - 缓存层级结构
  10. mysql编程流程控制_MySql流程控制结构
  11. android:xml属性集
  12. 【uTenux实验】中断处理
  13. Dispose(bool disposing)模式被破坏
  14. [Python] 贡献度分析
  15. BugkuCTF:宽带泄露;隐写2
  16. java 分布式缓存 开源_Java开源分布式键-值缓存系统Voldemort
  17. 内网搭建speedtest测速工具
  18. 新一配:perl循环调用python爬虫批量下载喜马拉雅音频
  19. 台式计算机虚拟内存怎么设置,教你怎么设置电脑的虚拟内存
  20. 大学生职业生涯规划的意义

热门文章

  1. 移动开发痛点之一-接口验证之PostMan图文教程
  2. 数据库表结构设计方法
  3. 转载:c#的逆向工程-IL指令集
  4. javaScript技巧表:单提交验证类[转载]
  5. Win32 Thread Information Block
  6. 给C#的oracle绿色版
  7. 转:AWK 简明教程
  8. shellcode xor编码/解码[1]
  9. Exchange2010 owa 访问 http 500 内部服务器错误
  10. 不全屏放映ppt的方法