C# 面向对象编程


1、C# 对象

创建对象有两个步骤。 首先,我们定义一个类。 类是对象的模板。 它是一个蓝图,描述了类对象共享的状态和行为。 一个类可以用来创建许多对象。 在运行时从类创建的对象称为该特定类的实例。

using System;

namespace Being
{
    class Being {}

    class Program
    {
        static void Main(string[] args)
        {
            var b = new Being();//类的实例
            Console.WriteLine(b);
        }
    }
}

2、C# 对象属性

对象属性是捆绑在类实例中的数据。 对象属性称为实例变量或成员字段。 实例变量是在类中定义的变量,该类中的每个对象都有一个单独的副本。

using System;

namespace ObjectAttributes
{
    class Person
    {
        public string name;
    }

    class Program
    {
        static void Main(string[] args)
        {
            var p1 = new Person();
            p1.name = "Jane";

            var p2 = new Person();
            p2.name = "Beky";

            Console.WriteLine(p1.name);
            Console.WriteLine(p2.name);
        }
    }
}

3、C# 方法

方法是在类主体内定义的函数。 它们用于通过对象的属性执行操作。 方法将模块化带入我们的程序。

using System;

namespace Methods
{
    class Circle
    {
        private int radius;

        public void SetRadius(int radius)
        {
            this.radius = radius;
        }

        public double Area()
        {
            return this.radius * this.radius * Math.PI;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var c = new Circle();
            c.SetRadius(5);

            Console.WriteLine(c.Area());
        }
    }
}

4、C# 访问修饰符

访问修饰符设置方法和成员字段的可见性。 C# 具有四个基本访问修饰符:publicprotectedprivateinternal。 可以从任何地方访问public成员。 protected成员只能在类本身内部以及继承的和父类访问。 private成员仅限于包含类型,例如 仅在其类或接口内。 可以从同一程序集(exe 或 DLL)中访问internal成员。

5、C# 构造函数

构造函数是一种特殊的方法。 创建对象时会自动调用它。 构造函数不返回值。 构造函数的目的是初始化对象的状态。 构造函数与类具有相同的名称。 构造函数是方法,因此它们也可以重载。

using System;

namespace Constructor
{
    class Being
    {
        public Being()
        {
            Console.WriteLine("Being is created");
        }

        public Being(string being)
        {
            Console.WriteLine("Being {0} is created", being);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            new Being();
            new Being("Tom");
        }
    }
}

6、C# 构造函数链接

构造函数链接是类从构造函数调用另一个构造函数的能力。 要从同一类调用另一个构造函数,我们使用this关键字。

using System;

namespace ConstructorChaining
{
    class Circle
    {
        public Circle(int radius)
        {
            Console.WriteLine("Circle, r={0} is created", radius);
        }

        public Circle() : this(1)
        {

        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            new Circle(5);
            new Circle();
        }
    }
}

7、C# 对象初始化器

对象初始化程序让我们在创建时将值分配给对象的任何可访问字段或属性,而无需调用构造函数。 属性或字段在{}括号内分配。 另外,我们可以为构造函数指定参数,也可以省略参数。

namespace ObjectInitializers
{
    class User
    {
        public User() {}

        public string Name { set; get; }
        public string Occupation { set; get; }

        public override string ToString()
        {
            return $"{Name} is a {Occupation}";
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var u = new User { Name = "John Doe", Occupation = "gardener" };
            Console.WriteLine(u);
        }
    }
}

8、C# 类常量

C# 可以创建类常量。 这些常量不属于具体对象。 他们属于阶级。 按照约定,常量用大写字母表示。

using System;

namespace ClassConstants
{
    class Math
    {
        public const double PI = 3.14159265359;
    }

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(Math.PI);
        }
    }
}

9、C# 继承

继承是使用已经定义的类形成新类的方法。 新形成的类称为派生的类,我们派生的类称为基类。 继承的重要好处是代码重用和降低程序的复杂性。 派生类(后代)将覆盖或扩展基类(祖先)的功能。

using System;

namespace Inheritance
{
    class Being
    {
        public Being()
        {
            Console.WriteLine("Being is created");
        }
    }

    class Human : Being
    {
        public Human()
        {
            Console.WriteLine("Human is created");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            new Human();
        }
    }
}

10、C# 抽象类和方法

抽象类无法实例化。 如果一个类至少包含一个抽象方法,则也必须将其声明为抽象方法。 抽象方法无法实现; 他们只是声明方法的签名。 当我们从抽象类继承时,所有抽象方法都必须由派生类实现。 此外,必须以较少受限制的可见性声明这些方法。

using System;

namespace AbstractClass
{
    abstract class Drawing
    {
        protected int x = 0;
        protected int y = 0;

        public abstract double Area();

        public string GetCoordinates()
        {
            return string.Format("x: {0}, y: {1}", this.x, this.y);
        }
    }

    class Circle : Drawing
    {
        private int r;

        public Circle(int x, int y, int r)
        {
            this.x = x;
            this.y = y;
            this.r = r;
        }

        public override double Area()
        {
            return this.r * this.r * Math.PI;
        }

        public override string ToString()
        {
            return string.Format("Circle at x: {0}, y: {1}, radius: {2}",
                this.x, this.y, this.r);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var c = new Circle(12, 45, 22);

            Console.WriteLine(c);
            Console.WriteLine("Area of circle: {0}", c.Area());
            Console.WriteLine(c.GetCoordinates());
        }
    }
}

11、C# 部分类

使用partial关键字,可以将类的定义拆分到同一名称空间中的几个部分中。 该类也可以在多个文件中定义。

using System;

namespace PartialClass
{
    partial class Worker
    {
        public string DoWork()
        {
            return "Doing work";
        }
    }

    partial class Worker
    {
        public string DoPause()
        {
            return "Pausing";
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var worker = new Worker();

            Console.WriteLine(worker.DoWork());
            Console.WriteLine(worker.DoWork());
            Console.WriteLine(worker.DoPause());
        }
    }
}

相关