抽象和界面解释

时间:2010-09-30 15:13:04

标签: asp.net

可以通过一个适当的例子来解释我在asp.net,C#中的抽象和界面...... pleasse 我不是很了解它

3 个答案:

答案 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)。如果要在组件的所有实现中提供通用的实现功能,请使用抽象类。抽象类允许您部分实现您的类,而接口不包含任何成员的实现。