学习C#中的数据抽象

92 阅读7分钟

C#中的数据抽象

数据抽象的特点是只将最重要的细节显示给用户。用户不会看到那些琐碎的或非必要的单元。

它是识别一个项目中需要的属性而忽略其他属性的过程。一个项目的特性和行为将其与其他同类型的项目区分开来。

特征和行为也有助于对物品进行分类和分组。一个物体的属性和行为将它与其他物体区分开来。

抽象的类型

有两种类型的抽象;数据抽象控制抽象。数据抽象是指对数据细节的隐瞒,而控制抽象是指对实现细节的隐瞒。

数据和函数都可以使用面向对象的方法进行抽象。然而,OOP中的类通常是以一种方式构建的,数据被隐藏在外部世界,而函数则作为公共接口。也就是说,类外的其他函数可以直接访问该类的函数,而这些函数可以间接访问该类隐藏的数据。

数据抽象通过防止程序的其他部分无意的改变或操作来增强数据的安全性。这是因为类的内部特征对外界是隐藏的。

抽象类

抽象这个词指的是一个概念或想法,它本身没有物理形式,但作为其他事物的一个基础。在C#中,抽象类是一种不能被实例化的特定类型的类,这意味着你不能用它来制造对象。抽象类的目的是创建一个骨架框架,其他类可以从中派生出来。

抽象类没有自己的实现。开发人员和程序员必须从抽象类中继承,并在骨架结构之上建立,即设计他们的实现。

在抽象类中也可以看到抽象方法的声明。这些技术不能被定义。

在C#中,抽象是借助于抽象类来完成的。而且,一个抽象类不能直接实例化。

术语abstract ,在声明抽象类和方法之前,如下面的语法所示。

abstract class ClassName
{
public abstract void MethodName();
}

请记住,抽象方法不能被定义。因此,抽象方法的声明是以分号来结束的。只可能声明它们。在非抽象派生类中必须提供定义。

抽象类的工作原理是要求抽象关键字告诉编译器,该类是一个供派生类实现的骨架结构。如果编译器遇到一个从抽象基类派生出来的类,它会检查派生类,看是否所有的抽象方法和属性都被重写和实现。

抽象方法

在一个给定的抽象方法中没有主体,它只是在抽象类中被指定。在所有的非抽象类中必须使用覆盖关键字来实现一个抽象方法。抽象方法在被覆盖后就在非抽象类中了。

这个类可以派生自另一个类,然后这个类可以覆盖同一个抽象方法。为了给抽象函数提供功能,需要从抽象类中创建/派生出一个子类。

抽象方法经常被用于两个或更多的子类以不同的方式完成同一任务。因为子类经常需要实现一个接口,所以抽象的超类可以提供多个接口方法,而让子类去实现它们的抽象方法的变化。

C#中的抽象方法和抽象类的规则如下。

  1. 如果一个方法不是抽象的、外部的或部分的,就应该使用abstract修饰符指定为抽象的,否则会发生编译时错误。该方法必须声明一个主体,因为它不是抽象的、外部的或部分的。
public class Demo
{
    void k1();
}
  1. 如果一个类有一个抽象的方法,它必须用关键字abstract来声明;否则,将发生编译时错误。

尽管Demo.k1() 这个方法是抽象的,但是它被包含在非抽象类Demo 中。

public class Demo
{
    public abstract void k1();
}

正确的语法是。

public abstract class Demo
{
    public abstract void k1();
}
  1. 如果声明了一个抽象类,它就不能被实例化。实例化它将导致编译时错误。

公共抽象类Demo。

{
    public abstract void k1();
    public static void Main(String[] args)
    {
        Demo e = new Demo();
    }
}
  1. 抽象类的子类必须覆盖所有的抽象方法,或者该类必须被声明为抽象类;否则,将发生以下的编译时错误。
namespace AbstractDemo
{
    public abstract class Demo
    {
        public abstract void k1();
        public abstract void k2();
    }

    public class Sample : Demo
    {
        public override void k1()
        {
            Console.WriteLine("k1 method");
        }
    }
}

解决方案

  • 如下图所示,声明该类为抽象类。
public abstract class Sample : Demo
{
    public override void k1()
    {
        Console.WriteLine("k1 method");
    }
}
  • 覆盖所有抽象方法,如下图所示。
public class Sample : Demo
{
    public override void k1()
    {
        Console.WriteLine("k1 method");
    }
    public override void k2()
    {
        Console.WriteLine("k2 method");
    }
}

演示展示C#中抽象方法的使用。

using System;
namespace Abstractmethod
{
    public abstract class Plan
    {
        protected double rate;
        public abstract void getRate();
        public void calculation(int units)
        {
            Console.Write("BILL AMOUNT FOR " + units + " UNITS is: USD.");
            Console.WriteLine(rate * units);
        }
    }
    class CommercialPlan : Plan
    {
        public override void getRate()
        {
            rate = 5.00;
        }
    }
    class DomesticlPlan : Plan
    {
        public override void getRate()
        {
            rate = 2.50;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Plan p;
            Console.WriteLine("COMMERCIAL CONNECTION");
            p = new CommercialPlan();
            p.getRate();
            p.calculation(250);
            Console.WriteLine("DOMESTIC CONNECTION");
            p = new DomesticlPlan();
            p.getRate();
            p.calculation(150);
            Console.ReadKey();
        }
    }
}

程序的输出如下图所示。

COMMERCIAL CONNECTION
BILL AMOUNT FOR 250 UNITS is: USD.1250
DOMESTIC CONNECTION
BILL AMOUNT FOR 150 UNITS is: USD.375

抽象方法的特点

c#中的抽象方法有以下特点。

  • 一个虚拟方法是隐含在一个抽象方法中的。
  • 只有抽象类可以声明抽象方法。
  • 抽象方法声明中没有方法体,因为它没有给出任何实际的实现。方法声明仅仅以分号结束,而不是一个典型的方法块。
  • 所有的抽象方法都需要使用该抽象类的派生类。如果一个基类的虚拟方法被一个抽象类所继承,那么应该使用一个抽象方法来覆盖该虚拟方法。

抽象类和抽象方法的使用

在某些情况下,我们想建立一个声明抽象结构的超类,而不提供所有方法的完整实现。也就是说,在有些情况下,我们希望设计一个超类,它只是定义了一个所有子类都将共享的一般化的形式,而让每个子类来填充具体的内容。

考虑一下传统的shape 的例子;这可以在计算机辅助设计系统或游戏模拟中找到。基本类型是shape ,每个表格都有其颜色、大小和其他特征。

具体的形状,如圆形、方形、三角形等等,都是由此派生(继承)出来的,每一种都可能有额外的属性和行为。例如,某些形状可以被翻转。某些行为可能有所不同,例如在计算正方形的面积时。

下面的代码显示了抽象类和抽象方法的使用。

using System;

namespace abstraction
{

    abstract class Shape
    {
        public abstract int perimeter();
    }

    class Square : Shape
    {
        private int side;

        public Square(int y = 0)
        {
            side = y;
        }

        public override int perimeter()
        {
            Console.Write("Perimeter of the square is: ");
            return (side + side)*2;
        }
    }

    class abstraction
    {

        static void Main(string[] args)
        {
            Shape sh = new Square(13);

            double result = sh.perimeter();

            Console.Write("{0}", result);
        }
    }
}

上述程序的输出如图所示。

Perimeter of the square is: 52

封装与数据抽象

封装是对用户隐藏不需要的数据的技术。你也可以说,它是一种数据保护的方法。

说到C#抽象,它与封装截然相反。C#抽象是一个只向用户显示相关信息的系统。

抽象的优点

  • 它简化了看待事物的过程。
  • 减少了代码的重复,提高了可重用性。
  • 用户只看到重要的信息,这有助于提高程序或应用程序的安全性。

总结

在本教程中,我们已经了解了什么是数据抽象。什么是抽象类、抽象方法,以及C#编程语言中抽象的优点和缺点。

我们还学习了如何使用抽象类和方法,以及应用它们时的规则。

在C#中的抽象有助于程序员区分哪些项目/组件将是可见的,哪些将被隐藏起来,不被桌面应用程序用户发现。