zoukankan      html  css  js  c++  java
  • C#学习记录4——结构体,接口

    1.结构体

    对于C++语言来说,其实结构体和类几乎没有什么太大的区别。类能够实现的功能,使用结构体大部分也可以。

    不过,在C#里面,我们把结构体看作是一种轻量的类的替代品。它和类一样有构造方法,属性,成员属性/数据,甚至是操作符。注意struct构造方法必须有传入参数。

    当然struct也不是完全支持类的所有功能的。

    首先,结构体无法进行继承。也就是说,结构体不想类那样灵活,代码也无法复用。

    其次,也是非常重要的一点:结构体是一种值类型,而类是引用类型。这两种类型的区别,可以查看C#学习记录3上,里面关于类的第一点。

    总的来说,一般只在定义一些内容小,较简单的类型时才会用到结构体。

    结构体的声明十分的简单,这里就不举例了。

    2.接口

    C#和Java支持结构,而C++是不支持的。

    如果你了解抽象类是个什么鬼,那么这个接口跟他差不多的东西。

    接口优于抽象类的地方在于:当类继承了某个抽象类时,那么这个抽象类就作为基类存在。而接口则是将一种合同式的约定混入到已成立的继承树中。

    这句话可以理解为,由于C#的单继承要求(即一个子类只能继承一个父类),而当希望“继承”多个不同的类时,就无法通过继承实现了。而类是可以实现多个接口的

    1 abstract class Walk
    2 {
    3     abstract public void SomeMethod();   
    4 }
    1 interface IWalk //接口的命名一般以大写I开头
    2 {
    3     void SomeMethod();
    4 }

    上面两段代码,一个事抽象类,一个是接口。现在考虑如果我们有另一个类Run,现需要创造一个Person类同时继承Walk和Run(人既能跑又能跳)。

    public class Person: Walk, Run
    {
    }

     这种方法就不能实现,因为一个类不能由多个父类

    public class Person: IWalk, Run
    {
    }

    只能这样实现。在继承树中,Run是Person的父类,而IWalk只是在Person上加入的协定,不影响继承树

    既然介绍了允许继承多个接口,那么自然而然就产生了一个疑问:如果继承的两个接口中有同名的方法,那怎么办?

     1 interface IProgrammer
     2 {
     3     void Work();
     4 }
     5 interface IWriter
     6 {
     7     void Work();
     8 }
     9 public class Person1: IProgrammer, IWriter
    10 {
    11     void IProgrammer.Work()           //显示实现
    12     {
    13 
    14     }
    15     public virtual void Work()        //隐式实现
    16     {
    17 
    18     }
    19 }

    如上例所示。作为程序员和作家,都有工作的方法,如果某个人在编程的同时还出版图书,那么他就同时实现了两份工作,而区分两份工作Work的最好方法是通过显示实现。
    即用接口名.方法名的形式说明。不过,显示实现不能设置访问修饰字(即public,private等),他被默认为是公共的。另外显示实现的方法还不能使用abstract,virtual,override,new修饰字。并且对于Person1的某一个对象来说,直接通过对象来访问Work方法是会被理解成调用隐式实现的某个方法。将该对象强制转换成对应接口类型: Person1 p = new Person1(); IProgrammer pAsProg = p; pAsProg.Work();

    上面说了强制将Person1的实例转换成IProgrammer。除了上面的方法,另外一种是使用as操作符。

    IProgrammer pAsProg = p as IProgrammer;

    as操作符有左右两个值。它将左值转换为右值所指明的类型,如果不能成功转换,则返回null。

  • 相关阅读:
    <![CDATA[文本内容]]>
    Java对于表达式中的自动类型提升
    oracle循环语句
    Recastnavigation 创建 off-mesh link 的潜规则
    CritterAI 翻译 Configuration Parameters
    ndk-build 修改输出so位置 (change ndk-build output so lib file path )
    C# List<> Find相关接口学习
    C++ sizeof(struct) 的注意
    Unity使用Resources读取Resources路径下的二进制文件(Binary Data)必须使用 .bytes扩展名
    C++ ifstream ofstream 注意事项
  • 原文地址:https://www.cnblogs.com/sywang/p/4393156.html
Copyright © 2011-2022 走看看