1

我正在尝试通过接口提高我的生产力和可扩展性。它们非常强大,但我在理解或实施方面遇到了障碍。

假设,如果我有一个我无法控制的用户界面;但我正在编写一个将执行一系列逻辑的类库。我最初的想法是这样的:

public interface ISiteForm
{
     public string FirstName { get; set; }
     public string LastName { get; set; }

     // Also any other User Interface Form Fields.
}

它将像这样布置,因此它可以由User Interface实现和引用。

public class SiteForm : ISiteForm
{
    public SiteForm()
    {
        FormPass();
    }

    public string FirstName
    {
        get { return firstName; }
        set { firstName = value; }
    }

    public string LastName
    {
         get { return lastName; }
         set { lastName = value; }
    }

    private string lastName,
    private string firstName,

    public void FormPass(string _lastName, string _firstName)
    {
        // Implementation to assign a value from User Interface into the interface.

        lastName = _lastName;
        firstName = _firstName;
    }
}

我的想法是当引用类库时,他们会在调用方法时将这些参数传递给方法。然后在创建班级时自然而然;它会将这些变量分配给接口。

那么,如果我有需要这些相同变量的项目的任何其他部分;我可以简单地调用接口并调整设置器值。

我的担忧是:

  • 接口本质上不需要逻辑
  • 它们通常是多态的,这将失去特定的实现。

这是通过接口传递参数的错误方法,以便可以在其他地方使用相同的变量吗?

4

4 回答 4

1

您没有为接口分配任何东西,它是一个实现合同。实现类包含所有逻辑。

如果您想使用相同的接口和变量,您可能需要查看依赖注入和控制反转之类的东西。

于 2013-03-06T17:08:14.663 回答
1

接口只用于多态性。您根本不应该在其中添加任何逻辑。

于 2013-03-06T17:08:43.413 回答
1

这是通过接口传递参数的错误方法,以便可以在其他地方使用相同的变量吗?

注意不要将对象实例与类型声明混淆。类型的局部变量ISiteForm可以在声明它的块中访问。例如,

public void M()
{
    ISiteForm s = new SiteForm();
}

如果我声明sSiteForm更改,则不会使s程序的其他部分更容易访问对象实例。

接口确实允许我们统一对待对象,而不管对象的底层类型如何。

例如

public void M(ISiteForm s)
{
    var propertyName = s.FirstName;
}

在这里,我不知道也不关心是否s是一种类型SiteForm或其他类型碰巧实现了ISiteForm. 行为是多态的。

它将像这样布置,因此它可以由用户界面实现和引用。

在这一点上,接口可用于解耦 n 层架构中的层。例如,您可以创建一个 Interfaces.dll。这个 DLL 可以容纳ISiteForm. 用户界面和业务逻辑都可以引用这个共享的 DLL。这种设计通过允许其他不相关的对象在层之间传递来允许松散耦合,并有助于避免循环引用

于 2013-03-06T17:33:06.810 回答
0

根据建议,我重新审视了解决方案。这就是我最终处理它的方式,我使用了依赖注入:接口注入方法。这种方法提供了我需要的解耦方法;同时仍然保持功能的目标。

我创建了以下内容:

public interface ISiteForm
{
     string GetSiteValues(string FirstName, string LastName);
}

这个特定的接口将充当我们的DependencyIDependency. 然后我创建了以下Class.

public class SiteForm : ISiteForm
{
    // Leave for now.
}

所以现在我们已经预先配置了我们的Interfaceand Class. 这将作为我们的Dependency

现在设置我们的注射器。

public interface ISiteFormInjector
{
    void InjectSiteForm(ISiteForm siteDetails);
}

我们的注入器将是我们的Dependent或在我们的情况下IDependent。现在我们需要更新我们的代码,以便物理实现数据注入。

public class SiteContent : ISiteFormInjector
{
    // Call our Dependency.
    ISiteForm _siteDetails;

    public void InjectSiteForm(ISiteForm siteDetails)
    {
         _siteDetails = siteDetails;
    }

    // Properties to Associate our Value.
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public string GetSiteValues()
    {
        return _siteDetails.GetSiteValues(FirstName, LastName);
    }
}

现在可以注入这些值;显然,通过一些重构,它将能够注入值,然后将这些变量传递给应用程序的其他方面。它遵循这种布局形式:

用于接口注入的 UML

于 2013-03-06T22:06:05.193 回答