《C#与.NET3.5高档程序设计(第4版卡塔尔(قطر‎》笔记6

2020-01-16 10:33栏目:竞技宝app
TAG:

黑桃K、编写一个应用程序,要求定义一个抽象的父类shape,在父类中要求包含抽象方法area。再定义个子类circle,继承shape类,并实现从键盘输入一个double型的圆的半径,计算并输出其面积。

如果不同的子类需要从父类类中调用相同的方法,比如都需要计算周长,从shape父类中调用calPerimeter()方法,但圆(circle)与三角形(triangle)计算周长的方式并不一样,如果在shape定义一个带有方法体的非抽象方法,一定不能满足同时计算圆与三角形周长的要求。如果定义shape为抽象类,calPerimeter为抽象方法,只需要在子类中重写calPerieter()方法适合自己就行了。
/*书本*竞技宝app,/

注意,这句话要经过判断,如果兼容才继续执行强制转换。

再定义一个Triangle.java文件

经典继承基本思想就是新的类可以利用或扩展既有类的功能。类定义中利用冒号运算符(:)在类之间创建继承关系。子类将拥有父类的每一个公共成员的访问权限。即使子类没有增加任何成员,也可以直接访问父类的公共成员,从而实现代码重用。注意,子类无法访问父类的任何私有成员哦。

 

6.2多态

/*自己总结的*/

  • public
  • private
  • internal
  • protected
  • protected internal
  • new
  • static
public class Triangle extends Shape{

    //定义三边
    private double a;
    private double b;
    private double c;

    public Triangle(double a,double b , double c) {
        this.setSides(a,b,c);
    }
    public void setSides(double a, double b , double c){
        if (a >= b+c && b >= a + c && c >= b + a) {
            System.out.println("三角形不合法");
            return;
        }
        this.a = a;
        this.b = b;
        this.c = c;
    }

    //重写父类计算周长的抽象方法
    @Override
    public double calPerimeter() {

        return a + b + c;
    }

    //重写父类的返回形状的方法
    @Override
    public String getTyp() {

        return "三角形";
    }

    public static void main(String[] args)
    {
        Shape s1 = new Triangle(3,4,5);
     //输出12.0
        System.out.println(s1.calPerimeter());

    }

get{return mepbenefits;}

抽象类的作用:

类似的应用就是如果方法参数是父类的,那么如果传递过来一个子类(这当然是允许的),实际上这个子类被隐式转换为父类了,那么在方法中,若经过判断是子类了,要调用子类的成员,那么就应该将这个参数转换回子类(强制转换),再调用相应子类成员。

从语义的角度来看抽象类是从多个具体类中抽象出来的父类,它具有更高层次的抽象。从多个具有相同特征的类中抽象出一个抽象类,以这个抽象类作为其子类的模版,从而避免了子类设计的任意性。

public double getbenefitcost()

2.含有抽象方法的类必须被定义为抽象类,抽象类必须被继承,抽象方法必须被重写

竞技宝官网,因此,一个真正的父类是无法转换为子类的,首先隐式的转换肯定是编译就出错的,其次,即使是强制转换了,编译不出错,但是运行时也会出错,那么这个转换到底有什么意义呢?

4.抽象方法只需声明,无需实现,抽象方法没有方法体

注意:类可以是抽象类或密封类,抽象方法必须在抽象类中,密封方法可以在任何类中。

1.当用abstract来修饰一个类时,这个类就是抽象类。当abstract来修饰一个方法时,这个方法就是抽象方法。

circle derivedCopy2 = (circle )baseObject;

3.抽象类不能被实例化,只能被子类继承。

as关键字在运行时快速检测某个类型是否和另外一个兼容,可以通过检查null返回值来检测兼容性(是否转换成功)。当然转换成功条件还是上面的黑体字。

public abstract class Shape {

    {
        System.out.println("执行Shape的初始化块");
    }
    //定义一个计算周长的抽象方法
    public abstract double calPerimeter();
    //定义一个返回形状的抽象方法
    public abstract String getTyp();
}

base不是只有构造函数逻辑才能使用,只要子类想访问由父类定义的公共或受保护的成员,都可以使用base关键字。如:

例,在同一个包下定义一个Shape.java文件

{

 

  • public :公共类
  • internal:内部类
  • partial:分部类
  • abstract:抽象类
  • sealed:密封类
  • static:静态类

base.fun1();

circle derivedCopy2 = (circle) baseObject;      // Throws exception

然而,若要公开被包含对象的功能给外部世界,就需要委托。简单说,委托就是增加成员到包含类,以便使用被包含对象的功能,例如在上面代码基础上,增加:

在《Effective C#》所有的50个建议中唯一一项关于不推荐函数的建议。GetHashCode()这个方法只会用于一个地方:给基于Hash的Collection(比如HashTable和Dictionary)的Key定义Hash值,也就是对象做为Key,而对象的GetHashCode()为该Key获取Hash值。

6.1继承

父类本来就是由子类转换来的,再转换回去(或继续往上转换),是没问题的。

object定义了一组成员。某些被声明为虚的,某些是实例级别的,某些是静态成员。

circle mycircles=new circle();

转换分为隐式转换和显式转换(或叫强制转换),同样,也就是两个规则:

看出规律是,等号后必须是等号前的子类。子类转换为父类,必然失去了子类所特有的东西,因为已经成为了父类。不要认为“丢失东西”的转换不可能系统也可以隐式转换哦。这些转换在本质上与常规的转换不同,这种转换实际上并没有对对象进行任何数据转换。如果要进行的转换是合法的,它们也仅是把新引用设置为对对象的引用。

至此,已经包含了另外一个对象,并在类内部使用它。

is的规则如下:

总结一下可以修饰成员变量的关键字:

public override sealed test()

第六章 继承和多态

class benefitpackage

return emp.computepaydeduction();

if  (baseObject is circle)

嵌套类型是C#中,可以直接在类或结构作用域中定义类型(枚举、类、接口、结构或委托),如果这样,被嵌套(或内部)类型被认为是嵌套类(或外部)类的成员。可以像操作其他成员一样来操作嵌套类型。

            Classchil b = new Classchil();//Classpar是父类,Classchil为子类
            Classpar c = new Classchil();//c是由Classchil转换过来的父类
            b = (Classchil)c;//自然,c这个父类是可以转换回原来的自己,子类的。

public、private、internal、protected 、protected internal不能同时使用。new和static不能同时存在。

{}

  • 凡是控制成员的访问修饰符,嵌套类型也可以使用;

{

另外,重写的可以是方法,也可以是属性,因为属性本质上还是方法!

circle derivedCopy2 = (circle) baseObject;   

多态的性质使得相关类型对相同的请求做出不同的响应。它为子类提供一种方式,使其可以自定义有其基类定义的方法,这个过程就叫做重写。(区分于重载哦),为了达到修改当前设计的目的,需要理解virtual和override关键字的作用。

as关键字:

没有太多需要强调的,有几个概念需要记住:

如果基类希望定义的方法可以而不是必须由子类重写,就应该在基类中指定方法是虚的(virtual)。在子类中,如果子类希望改变虚方法的实现细节,就必须使用override关键字。

关于嵌套类型,确实有点儿复杂,它既有类型的特点,也有成员的性质,请参考如下文章:

当基类定义了受保护数据或受保护成员后,他就创建一组可以直接被任何后代访问的项。对于家族以外的对象,受保护数据时私有的,无法访问!

版权声明:本文由龙竞技官网发布于竞技宝app,转载请注明出处:《C#与.NET3.5高档程序设计(第4版卡塔尔(قطر‎》笔记6