C# 抽象和封装有何不同?
我正在准备面试,并决定复习一下我的OOP概念。 有数百篇文章可用,但似乎每一篇都有不同的描述。 说 抽象是“识别具有相同特征的常见模式的过程” 系统的变化;一个抽象表示共同的模式 并提供了一种指定要使用哪种变体的方法 加布里埃尔) 并通过抽象类实现 有人说 抽象意味着只向客户显示必要的细节 对象 及 假设您在Employee类中有一个“CalculateSalary”方法, 它将EmployeeId作为参数,并返回 当前月份的员工,作为整数值。现在如果有人 他想用那种方法。他不需要关心员工的表现 对象计算工资?他唯一需要关心的是 方法的名称、输入参数和结果的格式 委员: 我在谷歌上搜索了一次又一次,结果似乎都没有给我一个正确的答案。 现在,封装在所有这些中的位置是什么? 我搜索了一下,找到了一个。甚至这些问题的答案都令人困惑 它说 封装是作为抽象的一部分使用的策略。封装 指对象的状态-对象封装其状态和 把它藏在外面;类的外部用户与它交互 通过其方法,但无法直接访问类状态。所以 这个类抽象掉了与它的类相关的实现细节 国家 另一位著名的成员说 它们是不同的概念 抽象是提炼出所有信息的过程 对象不需要/不重要的属性,只保留 最适合您所在领域的特性 现在我把整个概念搞砸了。我知道抽象类、继承、访问说明符等等。我只想知道在面试中被问及抽象和/或封装时,我应该如何回答。 请不要把它标为复制品。我知道有几个类似的问题。但我想避免相互矛盾的解释之间的混淆。有人能提出可信的联系吗?也欢迎链接到stackoverflow问题,除非它再次造成混淆。:)C# 抽象和封装有何不同?,c#,oop,encapsulation,abstraction,C#,Oop,Encapsulation,Abstraction,我正在准备面试,并决定复习一下我的OOP概念。 有数百篇文章可用,但似乎每一篇都有不同的描述。 说 抽象是“识别具有相同特征的常见模式的过程” 系统的变化;一个抽象表示共同的模式 并提供了一种指定要使用哪种变体的方法 加布里埃尔) 并通过抽象类实现 有人说 抽象意味着只向客户显示必要的细节 对象 及 假设您在Employee类中有一个“CalculateSalary”方法, 它将EmployeeId作为参数,并返回 当前月份的员工,作为整数值。现在如果有人 他想用那种方法。他不需要关心员工的表现
编辑:我需要答案,有点面向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;
}
}