【问题标题】:Class construction based on interface implementation基于接口实现的类构建
【发布时间】:2014-03-16 14:16:25
【问题描述】:

想象一下我们有这样的类:

public abstract class WebPage
{ 
    public WebPage() 
    { ... } 
}

public class LoginOrSignUpWebPage : WebPage, ILogin, ISignUp
{
    private Info _loginInfo;
    private Info _signUpInfo;
    public readonly Info LoginInfo { get { return _meats; } }
    public readonly Info SignUpInfo { get { return _legs; } }

    public class LoginOrSignUpWebPage(Info loginInfo, Info signUpInfo) : base()
    { ... }
}

我们可以看到WebPages 希望根据他们实现的不同接口有不同的实例化方式。

虽然为每个类实现单独的构造感觉很好,但我更喜欢使用继承来作为对象构造的基础。这样做的原因是因为另一个对象可能实现相同的接口并具有相同的实例化方式。
我曾考虑过使用某种(抽象的?)工厂方法,但我不确定这会如何工作。

问题:

切入正题,您认为基于对象继承的接口构建对象的最佳方法是什么?这将包括(可能)不同的参数,并且至少根据实现的接口传递不同的数据。

【问题讨论】:

  • 所以你想抽象出动物的构造?像工厂?你能举例说明如何使用这样的工厂吗?
  • 很好地指出,也许动物不是最好的例子!我会改变的。
  • 在上面编辑,希望这是一个更容易理解的例子。
  • 两件事:1)我同意工厂,但不确定它是否真的需要; 2) 你应该有一个LoginWebPage 和一个SignUpWebPage。如果您尝试拥有“非此即彼”的对象,您实际上是在卖空设计。如果明天您决定使用其他“注册类型”怎么办:RequestInfoWebPageGetEmailsWebPage 等。
  • 我可以理解,但请不要对示例阅读太深。问题更多地是关于对象通过基于已实现接口的构造函数或工厂方法实例化的方式。这通常适用于示例之外的许多情况。也许我问这个问题的方式有点懒惰 - 请参阅关于问题的最后一段的编辑。

标签: c# interface instantiation


【解决方案1】:

我们可以看到WebPages 希望根据他们实现的不同接口有不同的实例化方式。

不,他们不会。接口定义了类型在外部的外观。它们没有提供实现细节,也没有关于构造函数或构造过程的信息。如果你有一个接口类型的对象,你只知道你可以访问接口中定义的属性和方法。

声明WebPage 类型的方式,固定同时实现ILoginISignUp。因此,绝对需要实现这两个接口指定的任何内容。 WebPage 类型的每个对象都将始终提供两个接口所需的内容。

没有必要根据它正在实现的接口来构造一个对象,因为你正在实现的接口在编译时是已知的,以后不能更改。因此,对于实现接口的类型,您只需直接指定其构造方式即可。

【讨论】:

  • 嗯,确实有道理,对此感到抱歉。谢谢你的回答。
  • 补充一点,注册和登录是不同的用例,应该是不同的页面。
猜你喜欢
  • 1970-01-01
  • 2016-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-30
  • 1970-01-01
  • 2016-12-30
  • 1970-01-01
相关资源
最近更新 更多