继承抽象类注意事项

    public abstract class PartBase : Space
    {
        #region 基本属性
        /// <summary>
        /// 是否复合板
        /// </summary>
        public bool IsCladPart { get; set; }
        /// <summary>
        /// 基层密度(kg/L)
        /// </summary>
        public double BaseDensity { get; set; }
        /// <summary>
        /// 复层密度(kg/L)
        /// </summary>
        public double CladDensity { get; set; }
        /// <summary>
        /// 基层材料
        /// </summary>
        public string BaseMaterial { get; set; }
        /// <summary>
        /// 复层材料
        /// </summary>
        public string CladMaterial { get; set; }
        /// <summary>
        /// 零件类型
        /// </summary>
        public PartType PartType { get; set; }
        #endregion 基本属性
        #region 控件属性
        public TextBox TbBaseDensity { get; set; }
        public TextBox TbCladDensity { get; set; }
        public TextBox TbBaseMaterial { get; set; }
        public TextBox TbCladMaterial { get; set; }
        public CheckBox CbxIsCladPart { get; set; }
        #endregion 控件属性
        #region 控件事件,由于是抽象类,需要在继承类中实现其事件
        public virtual void TbDensity_Validating(object sender, CancelEventArgs e)
        {
            "未实现【密度】的虚方法!".showAlert();
        }
        public virtual void TbCladMaterial_Validating(object sender, System.ComponentModel.CancelEventArgs e)
        {
            "未实现【复层材料】的虚方法!".showAlert();
        }
        public virtual void TbBaseMaterial_Validating(object sender, System.ComponentModel.CancelEventArgs e)
        {
            "未实现【基层材料】的虚方法!".showAlert();
        }
        public virtual void CbxIsCladPlate_CheckedChanged(object sender, EventArgs e)
        {
            "未实现【是否复合板】的虚方法!".showAlert();
        }

        #endregion 控件事件,由于是抽象类,需要在继承类中实现其事件
        public PartBase()
        {

        }
        /// <summary>
        /// 继承腔体类中的属性值
        /// 并且设置下一级类中的属性值
        /// </summary>
        /// <param name="v"></param>
        /// <param name="s"></param>
        public PartBase(Vessel v, Space s)
                : base(v, s)
        {
        }
    }

抽象类

继承抽象类的下一级普通类需要:

1.重写抽象类A中的虚事件。

2.赋值A中属性便于向下传递。

3.本类B中的属性值需要通过类实例b传递到下一级属性中。

4.普通类B必须要有一个代表类实例的属性b,便于在本类中进行值的储存。比如,验证TextBox中用户输入的数值,如果值可以接受的话可以存储在b属性中。

5.在下级类实例化构造过程中传值给此实例属性b。

    public class ShellBase : PartBase
    {
        #region 公用属性
        /// <summary>
        /// 壳体名义厚度
        /// </summary>
        protected string zShellTn;
        /// <summary>
        /// 壳体名义厚度
        /// </summary>
        public string ShellTn
        {
            get
            {
                return zShellTn;
            }
            set
            {
                zShellTn = value;
                if (IsCladPart)
                {
                    if (value.Contains("+"))
                    {
                        TnBase = double.Parse(value.Split(‘+‘)[0]);
                        TnClad = double.Parse(value.Split(‘+‘)[1]);
                        Tn = TnBase + TnClad;
                    }
                    else
                    {

                    }
                }
                else if (!string.IsNullOrEmpty(value))
                {
                    if (value.Contains("+"))
                    {

                    }
                    else
                    {
                        double tn = 0;
                        double.TryParse(value, out tn);
                        Tn = tn;
                    }
                }
            }
        }
        /// <summary>
        /// 壳体公称厚度
        /// </summary>
        public double Tn { get; set; }
        /// <summary>
        /// 是否为外径基准
        /// </summary>
        public bool IsBasedOnOD { get; set; }
        /// <summary>
        /// 壳体公称直径
        /// </summary>
        public double ShellDn { get; set; }
        /// <summary>
        /// 基层厚度
        /// </summary>
        public double TnBase { get; set; }

        /// <summary>
        /// 复层板厚
        /// </summary>
        public double TnClad { get; set; }
        /// <summary>
        /// 当前类的一个实例,用于记录验证时的值,重要,它是一个传值桥梁
        /// </summary>
        public ShellBase Shell { get; set; }
        #endregion 公用属性
        #region 几何属性
        /// <summary>
        /// 体积
        /// </summary>
        public double Volume { get; set; }
        /// <summary>
        /// 内表面积
        /// </summary>
        public double InnerArea { get; set; }
        /// <summary>
        /// 外表面积
        /// </summary>
        public double OuterArea { get; set; }
        /// <summary>
        /// 质量
        /// </summary>
        public double Mass { get; set; }
        #endregion 几何属性
        #region 控件属性
        public CheckBox CbxIsBasedOnOD { get; set; }
        public TextBox TbShellDn { get; set; }
        public TextBox TbShellTn { get; set; }
        public Label LblVolume { get; set; }
        public Label LblMass { get; set; }
        public Label LblInnerArea { get; set; }
        public Label LblOutterArea { get; set; }
        #endregion 控件属性
        #region 控件事件
        private void TbShellTn_Validating(object sender, System.ComponentModel.CancelEventArgs e)
        {
            if (TbShellTn.Text == "")
            {
                ErrShow.Clear();
                return;
            }
            if (IsCladPart)
            {
                List<double> lst = TbShellTn.getCladPlateThickness();
                Shell.ShellTn = TbShellTn.Text;
                if (lst.Count > 1)
                {
                    Shell.TnBase = lst[0];
                    Shell.TnClad = lst[1];
                    Shell.Tn = TnBase + TnClad;
                    ErrShow.Clear();
                }
                else
                {
                    ErrShow.SetError(TbShellTn, "请按复合板的厚度【50+4.5】的格式填写!");
                    e.Cancel = true;
                }
            }
            else
            {
                Shell.TnBase = TbShellTn.getNumber();
                Shell.Tn = TnBase;
                Shell.ShellTn = TbShellTn.Text;
                ErrShow.Clear();
            }
        }
        private void TbShellDn_Validating(object sender, System.ComponentModel.CancelEventArgs e)
        {
            if (TbShellDn.Text == "")
            {
                ErrShow.Clear();
                return;
            }
            double dn = 0;
            double.TryParse(TbShellDn.Text, out dn);
            if (dn > 20)
            {
                Shell.ShellDn = dn;
                ErrShow.Clear();
            }
            else
            {
                ErrShow.SetError(TbShellDn, "输入的数据有误!");
                e.Cancel = true;
            }
        }
        private void CbxIsBasedOnOD_CheckedChanged(object sender, EventArgs e)
        {
            Shell.IsBasedOnOD = CbxIsBasedOnOD.Checked;
        }

        /// <summary>
        /// 重写抽象类中的方法
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public override void CbxIsCladPlate_CheckedChanged(object sender, EventArgs e)
        {
            Shell.IsCladPart = CbxIsCladPart.Checked;
        }
        public override void TbDensity_Validating(object sender, CancelEventArgs e)
        {
            TextBox tb = (TextBox)sender;
            if (tb.Text == "")
            {
                if (tb == TbBaseDensity)
                {
                    Shell.BaseDensity = 0;
                }
                else
                {
                    Shell.CladDensity = 0;
                }
                ErrShow.Clear();
                return;
            }
            double midu = 0;

            double.TryParse(tb.Text, out midu);
            if (midu > 1 && midu < 30)
            {
                if (tb == TbBaseDensity)
                {
                    Shell.BaseDensity = midu;
                }
                else
                {
                    Shell.CladDensity = midu;
                }
                ErrShow.Clear();
            }
            else
            {
                ErrShow.SetError(tb, "密度输入有问题!");
                e.Cancel = true;
            }
        }
        public override void TbCladMaterial_Validating(object sender, System.ComponentModel.CancelEventArgs e)
        {
            Shell.CladMaterial = TbCladMaterial.Text;
        }
        public override void TbBaseMaterial_Validating(object sender, System.ComponentModel.CancelEventArgs e)
        {
            Shell.BaseMaterial = TbBaseMaterial.Text;
        }
        #endregion 控件事件
        public ShellBase()
        {
        }
        public ShellBase(Vessel V, Space S)
                : base(V, S)
        {

        }
        /// <summary>
        /// 继承腔体类中的属性值
        /// 并且设置下一级类中的属性值
        /// </summary>
        /// <param name="V"></param>
        /// <param name="S"></param>
        public ShellBase(Vessel V, Space S, ShellBase SB)
                : base(V, S)
        {
            //传值
            Shell = SB;
            #region 控件赋值
            //PartBase
            if (SB.CbxIsCladPart != null)
            {
                CbxIsCladPart = SB.CbxIsCladPart;
            }
            if (SB.TbBaseDensity != null)
            {
                TbBaseDensity = SB.TbBaseDensity;
            }
            if (SB.TbCladDensity != null)
            {
                TbCladDensity = SB.TbCladDensity;
            }
            if (SB.TbBaseMaterial != null)
            {
                TbBaseMaterial = SB.TbBaseMaterial;
            }
            if (SB.TbCladMaterial != null)
            {
                TbCladMaterial = SB.TbCladMaterial;
            }
            //ShellBase
            if (SB.CbxIsBasedOnOD != null)
            {
                CbxIsBasedOnOD = SB.CbxIsBasedOnOD;
            }
            if (SB.TbShellDn != null)
            {
                TbShellDn = SB.TbShellDn;
            }
            if (SB.TbShellTn != null)
            {
                TbShellTn = SB.TbShellTn;
            }
            #endregion 控件赋值
            #region 属性传值
            IsBasedOnOD = SB.IsBasedOnOD;
            ShellDn = SB.ShellDn;
            Tn = SB.Tn;
            ShellTn = SB.ShellTn;
            TnBase = SB.TnBase;
            TnClad = SB.TnClad;
            #endregion 属性传值
            #region 通过将SB赋值给本类中属性Shell,用Shell来接收控件验证时得到的参数值,然后传值到下一个继承者
            //赋值是从抽象类中来的
            IsCladPart = SB.IsCladPart;
            BaseDensity = SB.BaseDensity;
            CladDensity = SB.CladDensity;
            BaseMaterial = SB.BaseMaterial;
            CladMaterial = SB.CladMaterial;
            #endregion 通过将SB赋值给本类中属性Shell,用Shell来接收控件验证时得到的参数值,然后传值到下一个继承者
        }
        /// <summary>
        /// 在底层使用时进行调用,必须在控件赋值后进行使用,否则无效
        /// </summary>
        public void ShellSetting()
        {
            #region 上一个抽象类中的控件
            if (TbBaseDensity != null)
            {
                TbBaseDensity.Validating -= TbDensity_Validating;
                TbBaseDensity.Validating += TbDensity_Validating;
            }
            if (TbCladDensity != null)
            {
                TbCladDensity.Validating -= TbDensity_Validating;
                TbCladDensity.Validating += TbDensity_Validating;
            }
            if (TbBaseMaterial != null)
            {
                TbBaseMaterial.Validating -= TbBaseMaterial_Validating;
                TbBaseMaterial.Validating += TbBaseMaterial_Validating;
            }
            if (TbCladMaterial != null)
            {
                TbCladMaterial.Validating -= TbCladMaterial_Validating;
                TbCladMaterial.Validating += TbCladMaterial_Validating;
            }
            if (CbxIsCladPart != null)
            {
                CbxIsCladPart.CheckedChanged -= CbxIsCladPlate_CheckedChanged;
                CbxIsCladPart.CheckedChanged += CbxIsCladPlate_CheckedChanged;
            }
            #endregion 上一个抽象类中的控件
            #region 本类中的控件
            if (TbShellDn != null)
            {
                TbShellDn.Validating -= TbShellDn_Validating;
                TbShellDn.Validating += TbShellDn_Validating;
            }
            if (TbShellTn != null)
            {
                TbShellTn.Validating -= TbShellTn_Validating;
                TbShellTn.Validating += TbShellTn_Validating;
            }
            if (CbxIsBasedOnOD != null)
            {
                CbxIsBasedOnOD.CheckedChanged -= CbxIsBasedOnOD_CheckedChanged;
                CbxIsBasedOnOD.CheckedChanged += CbxIsBasedOnOD_CheckedChanged;
            }
            #endregion 本类中的控件
        }
    }

继承类

6.再下一级的类C中只需要管好自己类中属性的向下传递即可。

    public class HeadBase : ShellBase
    {
        #region 属性设置

        /// <summary>
        /// 封头类型
        /// </summary>
        protected HeadType zHeadType;
        /// <summary>
        /// 封头类型
        /// </summary>
        public HeadType HeadType
        {
            get
            {
                return zHeadType;
            }
            set
            {
                zHeadType = value;
            }
        }

        /// <summary>
        /// 封头最小厚度
        /// </summary>
        protected double ztmin;
        /// <summary>
        /// 封头最小厚度
        /// </summary>
        public double tmin
        {
            get
            {
                return ztmin;
            }
            set
            {
                ztmin = value;
            }
        }
        /// <summary>
        /// 封头标准,程序中直接设置
        /// </summary>
        protected string zHeadStandard;
        /// <summary>
        /// 封头标准,程序中直接设置
        /// </summary>
        public string HeadStandard
        {
            get
            {
                return zHeadStandard;
            }
            set
            {
                zHeadStandard = value;
            }
        }
        /// <summary>
        /// 封头直边
        /// </summary>
        protected double zh;
        /// <summary>
        /// 封头直边
        /// </summary>
        public double h
        {
            get
            {
                return zh;
            }
            set
            {
                zh = value;
            }
        }
        #endregion
        #region 控件属性
        public TextBox TbTmin { get; set; }
        public TextBox TbHeadStandard { get; set; }
        public TextBox Tbh { get; set; }
        #endregion 控件属性
        #region 控件事件
        /// <summary>
        /// 在下一级的实例中执行数据验证
        /// </summary>
        public void HeadSetting()
        {
            if (Tbh != null)
            {
                Tbh.Validating += Tbh_Validating;
            }
            if (TbTmin != null)
            {
                TbTmin.Validating += TbTmin_Validating;
            }
            if (TbHeadStandard != null)
            {
                TbHeadStandard.Validating += TbHeadStandard_Validating;
            }
        }

        private void TbHeadStandard_Validating(object sender, System.ComponentModel.CancelEventArgs e)
        {
            HeadStandard = TbHeadStandard.Text;
        }
        private void TbTmin_Validating(object sender, System.ComponentModel.CancelEventArgs e)
        {
            if (TbTmin.Text == "")
            {
                ErrShow.Clear();
                return;
            }
            double val = 0;
            double.TryParse(TbTmin.Text, out val);
            if (val <= 0)
            {
                ErrShow.SetError(TbTmin, "封头最小厚度应大于0");
                e.Cancel = true;
            }
            else if (Tn > 0)
            {
                if (val > Tn)
                {
                    ErrShow.SetError(TbTmin, "封头最小厚度应小于公称厚度");
                    e.Cancel = true;
                }
                else
                {
                    tmin = val;
                    ErrShow.Clear();
                }
            }
            else
            {
                tmin = val;
                ErrShow.Clear();
            }
        }
        private void Tbh_Validating(object sender, System.ComponentModel.CancelEventArgs e)
        {
            if (Tbh.Text == "")
            {
                ErrShow.Clear();
                return;
            }
            double val = 0;
            double.TryParse(Tbh.Text, out val);
            if (val < 25)
            {
                ErrShow.SetError(Tbh, "封头直边应大于等于25mm");
                e.Cancel = true;
            }
            else
            {
                h = val;
                ErrShow.Clear();
            }
        }
        #endregion 控件事件
        public HeadBase()
        {

        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="V"></param>
        /// <param name="S"></param>
        /// <param name="SB"></param>
        public HeadBase(Vessel V, Space S, ShellBase SB)
            : base(V, S, SB)
        {
        }
        /// <summary>
        /// 继承容器类中的属性值
        /// 继承腔体类中的属性值
        /// 并且设置下一级类中的属性值
        /// </summary>
        /// <param name="V"></param>
        /// <param name="S"></param>
        /// <param name="HB"></param>
        public HeadBase(Vessel V, Space S, ShellBase SB, HeadBase HB)
            : base(V, S, SB)
        {
            #region 控件继承
            if (HB.Tbh!=null)
            {
                Tbh = HB.Tbh;
            }
            if (HB.TbTmin != null)
            {
                TbTmin = HB.TbTmin;
            }
            if (HB.TbHeadStandard != null)
            {
                TbHeadStandard = HB.TbHeadStandard;
            }
            #endregion 控件继承

            #region 属性传值
            h = HB.h;
            tmin = HB.tmin;
            HeadStandard = HB.HeadStandard;
            #endregion 属性传值
        }

        #region 锥形封头公用函数
        public double wConeInArea(double Di, double Dis, double ang)
        {
            double angH = ang.DegreeToRadian();
            double L = (Di / 2 - Dis / 2) / angH.SinH();
            return ((Math.PI * L * (Di / 2 + Dis / 2)) * 1e-6).Round(2);
        }
        public double xConeVolume(double Di, double h1, double Dis, double h2, double R, double r, double ang, double tn)
        {
            double angH = ang.DegreeToRadian();
            double a = angH.SinH() / 4;
            double b = (angH.SinH() * angH.CosH() + angH) / 2 - angH.SinH();
            double c = 2 * angH.SinH() - Math.Pow(angH.SinH(), 3) / 3 - angH.SinH() * angH.CosH() - angH;
            double d = Math.PI * (a * Di * Di * R + b * Di * R * R + c * Math.Pow(R, 3));
            double e = (Math.Pow(Di - 2 * R * (1 - angH.CosH()), 3) - Math.Pow(Dis + 2 * (1 - angH.CosH()) * (r + tn), 3)) * Math.PI / (24 * Math.Tan(angH));
            double f = Math.PI * (a * Dis * Dis * (r + tn) - b * Dis * Math.Pow(r + tn, 2) + c * Math.Pow(r + tn, 3));
            double g = Math.PI * Di * Di * h1 / 4;
            double i = Math.PI * Dis * Dis * h2 / 4;
            return ((d + e + f + g + i) * 1e-9).Round(3);
        }
        #endregion 锥形封头公用函数

    }

下级类

7.再下级类D中也只需要管好自己类中属性的向下传递即可,本例中没有其它属性。
此类无关紧要,如果有也同“下级类”,此处省略。
8.调用类中应注意各实例的先后与赋值情况,否则容易导致出错。

    public partial class Test1 : Form
    {
        Vessel V = null;
        Space S = null;
        ShellBase SB = null;
        HeadBase HB = null;
        HeadEllipseBase HEB = null;

        public Test1()
        {
            InitializeComponent();
        }

        private void Test1_Load(object sender, EventArgs e)
        {
            V = new Vessel();
            V.ErrShow = errShow;
            S = new Space(V);
            SB = new ShellBase(V, S);
            //凡是抽象类中的属性必须在其继承的类的实例中赋值才可以用
            #region 控件赋值
            SB.TbBaseDensity = tbBaseDensity;
            SB.TbCladDensity = tbCladDensity;
            SB.TbBaseMaterial = tbBaseMaterial;
            SB.TbCladMaterial = tbCladMaterial;
            SB.CbxIsCladPart = cbxIsCladPart;
            //ShellBase
            //而当前类的属性则也直接在其实例中进行赋值
            SB.CbxIsBasedOnOD = cbxIsBasedOnOd;
            SB.TbShellDn = tbDn;
            SB.TbShellTn = tbTn;
            #endregion 控件赋值
            #region 直接赋值测试
            //SB.BaseDensity = 8;
            ////SB.CladDensity = 7;
            //SB.BaseMaterial = "SA-516 70";
            ////SB.CladMaterial = "SA-240 316L";
            //SB.IsCladPart = false;
            //SB.IsBasedOnOD = true;
            //SB.ShellDn = 1000;
            //SB.ShellTn = "10";
            #endregion 直接赋值测试
            //HeadBase
            HB = new HeadBase(V, S, SB);
            #region 控件赋值
            HB.TbTmin = tbTmin;
            HB.TbHeadStandard = tbStandard;
            HB.Tbh = tbh;
            #endregion 控件赋值
            #region 直接赋值测试
            //HB.tmin = 8;
            //HB.HeadStandard = "GB/T 25198-2012";
            //HB.h = 25;
            #endregion 直接赋值测试
            HB.ShellSetting();
            HB.HeadSetting();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void btnCal_Click(object sender, EventArgs e)
        {
            HEB = new HeadEllipseBase(V, S, SB, HB);
            HEB.LblVolume = lblVolumne;
            HEB.LblMass = lblMass;
            HEB.LblInnerArea = lblInnerArea;
            HEB.LblOutterArea = lblOutArea;
            HEB.Cal();
            HEB.SetResult();

        }
    }

调用类

时间: 2024-10-10 23:55:09

继承抽象类注意事项的相关文章

this/super/static/final/匿名对象/继承/抽象类/访问权限修饰符

1.this关键字的作用     1)调用本类中的属性;     2)调用本类中的构造方法;且只能放首行,且必须留一个构造方法作为出口,即不能递归调用     3)表示当前对象; 2.匿名对象     直接new出来的对象,不创建变量名,且只能使用一次,通常作为方法的参数及返回值使用 3.继承     继承是面向对象的三大特征之一,通过关键字:extends实现,被继承的类称为父类(也称作基类/超类),实现继承的类称为子类(也称作派生类).     特点:     (1)通过继承,子类可以直接访

[原创]抽象类实现接口,子类继承抽象类,这三者之间的关系?

①一个类实现一个接口,那么这个类必须实现该接口中的所有方法,因为接口中的方法默认都是 public,abstract类型的,所以实现接口的类都必须重写该接口中的所有方法,比如: interface A { boolean add(); boolean offer1(); boolean offer2(); } public class Test01 implements A{//必须实现A接口中的所有方法 @Override public boolean add() { return false

Android(java)学习笔记118:类继承的注意事项

1 /* 2 继承的注意事项: 3 A:子类只能继承父类所有非私有的成员(成员方法和成员变量) 4 B:子类不能继承父类的构造方法,但是可以通过super(马上讲)关键字去访问父类构造方法. 5 C:不要为了部分功能而去继承 6 class A { 7 public void show1(){} 8 public void show2(){} 9 } 10 11 class B { 12 public void show2(){} 13 public void show3(){} 14 } 15

Java回顾:用一个Demo来说明继承抽象类和实现接口的简单框架模型

大家都知道,在java应用开发中,要"面向接口编程". 那么什么是接口?接口有什么作用?接口如何使用?我们一起来回顾一下. [声明]欢迎转载,但请保留文章原始出处:http://blog.csdn.net/yelangjueqi/article/details/44701369 1,接口回顾: 1.1,Java中接口的概念 在Java中接口是一种特殊的抽象类,跟一般的抽象类相比,接口里面的所有方法都是抽象方法,接口里面的所有属性都是常量.也就是说,接口里面只有方法定义而没有任何方法实现

java继承————抽象类

抽象类概念 分析事物时,发现了共性内容,就出现向上抽取.会有这样一种特殊情况,就是方法功能声明相同,但方法功能主体不同.那么这时也可以抽取,但只抽取方法声明,不抽取方法主体.那么此方法就是一个抽象方法. 继承方式--关键字 abstract(抽象). 当定义了抽象函数的类也必须被abstract关键字修饰,被abstract关键字修饰的类是抽象类. 抽象类方法的定义 抽象方法定义的格式: 可以有成员变量:但是接口的成员变量必须是final public abstract 返回值类型 方法名(参数

第三章:继承/抽象类/接口

继承 在面向对象编程中,有两种截然不同的继承类型,实现继承和接口继承;C#中不支持多重继承,C#类可以派生自另一个类和任意多的接口 实现继承:表示一个类型派生自一个基类型,它拥有该基类型的所有成员字段和函数,在需要给现有类型添加功能或者许多相关类型共享一组重要的公共功能时.这种类型继承非常有用 接口继承:表示一个类型只继承了函数的签名,没有继承任何的实现代码 实现继承virtual/override /// <summary> /// 基类 /// </summary> class

深入浅出OOP(四): 多态和继承(抽象类)

在本文中,我们讨论OOP中的热点之一:抽象类.抽象类在各个编程语言中概念是一致的,但是C#稍微有些不一样.本文中我们会通过代码来实现抽象类,并一一进行解析. 深入理解OOP(一):多态和继承(初期绑定和编译时多态) 深入理解OOP(二):多态和继承(继承) 深入理解OOP(三):多态和继承(动态绑定和运行时多态) 深入理解OOP(四):多态和继承(C#中的抽象类) 深入理解OOP(五):C#中的访问修饰符(Public/Private/Protected/Internal/Sealed/Cons

继承抽象类

#ifndef VIRTUAL1 #define VIRTUAL1 #include<iostream> using namespace std; class Number{ public: Number(int i){ x = i; } virtual void show() = 0; protected: int x; }; class dec_type :public Number{//这里必须公有继承,否则派生类对象做实参无法传递给基类的 //引用对象. public: dec_typ

PHP对象和接口抽象类注意事项

Php 的对象的实现: 注:对象名称最好以对象名.class.php来进行命名. 1. 对于静态类的成员不能使用$this->这个来调用其静态类的成员和函数,应该使用self::成员或者方法来进行调用: 2.对于继承了静态类的新类需要调用父类的静态方法,应该采用parent::子类的静态成员和方法来进行调用. 3.定义类常量的时候其用const来定义,不能用define来定义.使用也需要使用self::常量成员来访问. Php的接口的实现 接口的名字最好以I+接口名.php进行命名. 需要对接口