Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 抽象和封装有何不同?_C#_Oop_Encapsulation_Abstraction - Fatal编程技术网

C# 抽象和封装有何不同?

C# 抽象和封装有何不同?,c#,oop,encapsulation,abstraction,C#,Oop,Encapsulation,Abstraction,我正在准备面试,并决定复习一下我的OOP概念。 有数百篇文章可用,但似乎每一篇都有不同的描述。 说 抽象是“识别具有相同特征的常见模式的过程” 系统的变化;一个抽象表示共同的模式 并提供了一种指定要使用哪种变体的方法 加布里埃尔) 并通过抽象类实现 有人说 抽象意味着只向客户显示必要的细节 对象 及 假设您在Employee类中有一个“CalculateSalary”方法, 它将EmployeeId作为参数,并返回 当前月份的员工,作为整数值。现在如果有人 他想用那种方法。他不需要关心员工的表现

我正在准备面试,并决定复习一下我的OOP概念。 有数百篇文章可用,但似乎每一篇都有不同的描述。 说

抽象是“识别具有相同特征的常见模式的过程” 系统的变化;一个抽象表示共同的模式 并提供了一种指定要使用哪种变体的方法 加布里埃尔)

并通过抽象类实现

有人说

抽象意味着只向客户显示必要的细节 对象

假设您在Employee类中有一个“CalculateSalary”方法, 它将EmployeeId作为参数,并返回 当前月份的员工,作为整数值。现在如果有人 他想用那种方法。他不需要关心员工的表现 对象计算工资?他唯一需要关心的是 方法的名称、输入参数和结果的格式 委员:

我在谷歌上搜索了一次又一次,结果似乎都没有给我一个正确的答案。 现在,封装在所有这些中的位置是什么? 我搜索了一下,找到了一个。甚至这些问题的答案都令人困惑 它说

封装是作为抽象的一部分使用的策略。封装 指对象的状态-对象封装其状态和 把它藏在外面;类的外部用户与它交互 通过其方法,但无法直接访问类状态。所以 这个类抽象掉了与它的类相关的实现细节 国家

另一位著名的成员说

它们是不同的概念

抽象是提炼出所有信息的过程 对象不需要/不重要的属性,只保留 最适合您所在领域的特性

现在我把整个概念搞砸了。我知道抽象类、继承、访问说明符等等。我只想知道在面试中被问及抽象和/或封装时,我应该如何回答。

请不要把它标为复制品。我知道有几个类似的问题。但我想避免相互矛盾的解释之间的混淆。有人能提出可信的联系吗?也欢迎链接到stackoverflow问题,除非它再次造成混淆。:)


编辑:我需要答案,有点面向c封装:使用getter和setter等隐藏数据


抽象:使用抽象类和接口等隐藏实现。

据我所知,封装是将类的数据隐藏在类本身,并且只有在必须从外部世界访问的情况下才能通过setter/getter访问

抽象是类本身的设计

也就是说,如何创建类树,哪些方法是通用的,哪些是继承的,哪些可以重写,哪些属性仅在私有级别,哪些是受保护的,如何构建类继承树,是否使用最终类、抽象类和接口实现


抽象更多地放在oo设计阶段,而封装也加入到开发阶段。

我认为它们是稍微不同的概念,但通常是一起应用的。封装是一种对调用方隐藏实现细节的技术,而抽象更像是一种设计理念,涉及创建类似于熟悉对象/过程的对象,以帮助理解。封装只是可用于创建抽象的许多技术之一

例如,以“windows”为例。它们不是传统意义上的窗口,它们只是屏幕上的图形正方形。但是把它们看作窗口是很有用的。这是一个抽象概念


如果“windows API”隐藏了文本或图形如何在窗口边界内物理呈现的细节,那就是封装。

在抽象的上下文中,我总是遇到一个例子;汽车上的自动变速器与手动变速器。手动变速器隐藏了一些换档操作,但作为驾驶员,您仍然需要离合器和换档。自动变速器封装了换档的所有细节,即对您隐藏它,因此它是换档过程的更高抽象。

my 2c

封装的目的是对类的用户隐藏实现细节,例如,如果您在类中内部保留一个std::项列表,然后决定std::vector更有效,那么您可以在用户不关心的情况下更改它。也就是说,您与任一stl容器交互的方式都得益于抽象,例如,列表和向量都可以使用类似的方法(迭代器)以相同的方式进行遍历

抽象意味着只向对象的客户机显示必要的细节

实际上,这就是封装。另请参阅wikipedia文章的第一部分,以免被封装和数据隐藏所混淆

请记住,简单地将所有类成员1:1隐藏在属性后面根本不是封装。封装就是保护不变量和隐藏实现细节

这里有一篇关于这方面的好文章。 还可以看看那篇文章中链接的文章

类、属性和访问修饰符是在c#中提供封装的工具

您进行封装是为了降低复杂性

抽象是“识别具有系统变化的常见模式的过程;抽象表示常见模式并提供指定使用哪种变化的方法”(Richard Gabriel)

是的,这是一个很好的抽象定义

他们是不同的
  namespace CustomerContent
    {
       public class Customer
       {
           public string CustomerCode = "";
           public string CustomerName = "";
           public void ADD()
           {
              //my DB code will go here
           }
     public bool Validate()
     {
    //Granular Customer Code and Name
    return true;
     }

     public bool CreateDBObject()
     {
    //DB Connection Code
    return true;
     }


class Program
{
   static void main(String[] args)
   {
     CustomerComponent.Customer obj = new CustomerComponent.Customer;

     obj.CustomerCode = "s001";
     obj.CustomerName = "Mac";

     obj.Validate();
     obj.CreateDBObject();

     obj.ADD();
    }
}
 namespace CustomerContent
 {
     public class Customer
     {
        public string CustomerCode = "";
        public string CustomerName = "";

        public void ADD()
        {
           //my DB code will go here
        }

        private bool Validate()
        {
           //Granular Customer Code and Name
           return true;
        }

        private bool CreateDBObject()
        {
           //DB Connection Code
           return true;
        }


  class Program
  {
     static void main(String[] args)
     {
        CustomerComponent.Customer obj = new CustomerComponent.Customer;

        obj.CustomerCode = "s001";

        obj.CustomerName = "Mac";

        obj.ADD();
   }
}
public class Person
    {
        private int Id { get; set; }
        private string Name { get; set; }
        private string CustomName()
        {
            return "Name:- " + Name + " and Id is:- " + Id;
        }
    }
Person p = new Person();
p.CustomName();
public class Person
        {
            private int Id { get; set; }
            private string Name { get; set; }
            private string LastName {get; set;}
            public string CustomName()
            {
                return "Name:- " + Name + " and Id is:- " + Id + "last name:- " + LastName;
            }
        }