可以通过一个适当的例子来解释我在asp.net,C#中的抽象和界面...... pleasse 我不是很了解它
答案 0 :(得分:3)
在解释这个问题时,我经常发现以下示例非常有启发性:
免责声明:代码示例直接写入文本,可能包含我监督的错误。如果您发现此类错误,请通知我。
假设您有一个包含Customer表的数据库,并且在您的代码中有一个客户类:
class Customer
{
public int Id { get; set; }
public string Name { get; set; }
}
为了提供从数据库获取客户数据的机制,您需要编写一些类来执行该操作。这可以放在名为 repository 的东西中。现在,我们不希望我们的代码过分依赖我们使用的确切数据库。它可以是SQL服务器,也可以是文本文件。所以我们想要一个抽象层来屏蔽这些知识的代码。我们需要知道的是这样的存储库是什么样的:
public interface ICustomerRepository
{
Customer GetCustomer(int id);
IEnumerable<Customer> FindCustomers(string beginningOfName);
}
我们现在可以为我们使用的数据存储实现此接口:
public class SqlServerCustomerRepository : ICustomerRepository
{
public Customer GetCustomer(int id)
{
using(SqlConnection connection = new SqlConnection(connectionString))
{
// code to fetch data and populate Customer objects go here
}
}
// implementations of other members of ICustomerRepository
// left out to keep code short. Just imagine they are here :)
}
最后,当我们想要使用这段代码时,我们可以让工厂创建具体的ICustomerRepository
实现来使用:
public static class RepositoryFactory
{
public static ICustomerRepository CreateCustomerRepository()
{
return new SqlServerCustomerRepository();
}
}
...在我们需要数据的代码中:
ICustomerRepository repository = RepositoryFactory.CreateCustomerRepository();
IEnumerable<Customer> customers = repository.FindCustomers("A");
这样,消费代码和正在使用的特定类型的存储库之间没有硬连接(工厂方法除外,,但这是唯一存在这种知识的地方)。这样可以轻松替换具体的存储库实现。这对于测试也很有用,您可以在其中轻松创建模拟存储库,返回给定输入的硬编码结果,以便您可以对需要来自存储库的数据的代码进行单元测试。
答案 1 :(得分:1)
抽象的类和接口并不是严格的asp.net技术,而是OOP概念。
接口
接口就像一个类,但所有方法和属性都是抽象的。接口不能像抽象类一样实例化。 Interface中定义的所有方法和属性默认为public和abstract。
接口通常是指实体向外部提供的抽象。接口可以帮助分离外部和内部通信的方法,而不会影响外部实体与类型交互的方式。
例:
如果你有interface IDoSomething { void Do(); }
实现接口的类必须为Do()方法提供一个主体,例如
class SomeClass : IDoSomething
{
public void Do()
{
//body of the method
}
}
这样做的好处是当你创建只需要Do方法的东西时,你可以传递接口而不是类。
public static void SomeMethod(IDoSomething obj)
{
obj.Do();
}
现在SomeMethod(IDoSomething obj)
将适用于任何实现IDoSomething
抽象类
抽象类是一个至少有一个定义为抽象的方法的类。这种类无法实例化。抽象类可以有一个或多个抽象方法和属性,以及其他方法和属性,如普通类。
这个想法是一样的,但在抽象类中,你可以使用已实现的逻辑,字段等方法。
答案 2 :(得分:0)
<强>抽象强>
抽象是隐藏对象工作方式的过程,它只是以我们理解对象的方式显示对象的信息。意味着它代表了必要的细节而不显示地面细节。我们将所有变量和方法放在必要的类中。
例如:员工和病人。
公司有兴趣填写员工详情,如姓名,地址,资格,DOB,年龄,手机,商标,经验等
医院有兴趣填写患者详情,如姓名,DOB,身高,体重,年龄,地址,手机,血型等。
公司和医院都有兴趣填写一些常见的字段,如姓名,年龄,DOB,地址,移动等。因此,我们可以创建一个由称为抽象类的常见事物组成的类。这个类不完整但可以继承其他类。
摘要与界面 您不能创建抽象类的对象,但可以对此进行派生。 抽象类可以包含抽象方法或非抽象方法。抽象成员在抽象类中没有任何实现,但必须在其派生类中提供相同的实现。
抽象类可以包含抽象成员以及非抽象成员。但是在接口中,所有成员都是隐式抽象的,并且接口的所有成员都必须覆盖其派生类。
使用所有抽象成员定义抽象类与定义接口类似。即我们可以说接口是一个包含所有抽象成员的抽象类 类可以只从一个基类继承,因此如果要使用抽象类为一组类提供多态,它们必须都从该类继承。 抽象类也可以提供已经实现的成员。因此,您可以使用抽象类确保一定数量的相同功能,但不能使用接口。
以下是一些建议,可帮助您决定是使用接口还是抽象类来为组件提供多态性。
1)。如果您预计要创建组件的多个版本,请创建一个抽象类。抽象类提供了一种简单易用的组件版本。通过更新基类,所有继承类都会随更改自动更新。另一方面,接口一旦创建就无法更改。如果需要新版本的接口,则必须创建一个全新的接口。
2)。如果您创建的功能在各种不同的对象中都有用,请使用界面。抽象类应主要用于密切相关的对象,而接口最适合为不相关的类提供通用功能。
3)。如果您正在设计小巧,简洁的功能,请使用接口。如果您正在设计大型功能单元,请使用抽象类。
4)。如果要在组件的所有实现中提供通用的实现功能,请使用抽象类。抽象类允许您部分实现您的类,而接口不包含任何成员的实现。