【问题标题】:Force an object to be called via its interface强制通过其接口调用对象
【发布时间】:2010-02-09 02:13:36
【问题描述】:

如何强制仅通过其接口调用对象?这只能通过访问修饰符来完成,但在 C# 中却做不到。

我有:

public interface IProfile { string GetName(); }
public class Profile : IProfile { 
    public string GetName() { return "Linh"; }
}

我有一个类似上面的代码部分。我把它放在一个类库中,然后我生成一个程序集。

在 Web 项目中,一些程序员会添加对该程序集的引用。如果他们想调用 Profile 类,那么他们必须使用 IProfile 接口作为下面的声明:

IProfile ip = new Profile(); 
ip.GetName(); 

但是一些粗心的程序员不会这样做。他们将使用以下方式:

Profile pr = new Profile(); 
pr.GetName();

【问题讨论】:

  • 我写了一个类库,程序员会通过对象的接口调用其中的一些对象。但我认为这在 C# 中无法完成
  • Linh:请写一个你想做的伪代码版本。不是很清楚。
  • 你有什么问题?
  • 您是否要求显式接口实现,即指定只能通过接口引用而不是类引用来调用方法?或者关于让整个类内部化但将实例公开为接口类型?
  • 公共接口 IProfile { string GetName(); } 公共类配置文件: IProfile { 公共字符串 GetName() { return "Linh"; } } 我上面有一个代码部分。之后我将它放在类库中,然后生成一个程序集。在 Web 项目中,一些程序员会添加对该程序集的引用。如果他们想调用 Profile 类,那么他们必须使用 IProfile 接口作为下面的声明: IProfile ip = new Profile(); ip.GetName();但是一些粗心的程序员不会这样做。他们将使用以下方式: Profile pr = new Profile(); pr.GetName();

标签: c# oop interface


【解决方案1】:

这真的很简单。使用显式接口实现:

public interface IProfile { string GetName(); }
public class Profile : IProfile
{
    string IProfile.GetName() { return "Linh"; }
}

GetName 现在只能通过接口引用调用。

【讨论】:

  • True :-(。有足够代表的用户无法接受答案吗?也许我们应该有一个“次要”接受的答案功能(任何有足够代表的人都可以标记),它会自动如果问题发布者不想标记一个,可能会在一个月后被接受。
  • 我是一个非常宽容的人,但这个人似乎忽略了所有接受答案的提醒。他们似乎对英语有很好的掌握,所以他们的借口是什么?
  • @Moron:我不这么认为,因为它仍然允许某人获得Profile 类的实例,这是真正的问题(在我看来)。
  • @Silky:请参阅问题中 Linh 的 cmets。他/她不想要 IProfile ip = new Profile();误用为 Profile p = new Profile()。
  • @Moron:问题不在于实例。 OP 不希望通过实例直接调用该方法。他想要求通过接口调用方法。
【解决方案2】:

您需要采用工厂方法,如下所示:

using System;

using Ext;

namespace ConsoleApplication26
{
    class Program
    {
        static void Main(string[] args)
        {
            IFoo foo = FooFactory.GetFoo();
        }
    }
}


// another project/dll

namespace Ext
{
    public interface IFoo
    {
        void M ();
    }


    public static class FooFactory
    {
        public static IFoo GetFoo ()
        {
            return new Foo();
        }
    }


    class Foo : IFoo
    {
        public void M () { }
    }
}

【讨论】:

  • @Silky:这如何防止方法 M 被直接调用?
  • 您可能应该保护 Foo 的构造函数,以便只有模块中的其他类可以访问它。 (我不是 C# 程序员,所以我不知道什么是适当的访问级别。)编辑:哎呀,没有看到 Foo 类上没有“public”修饰符。
  • 约翰:关于他的评论,我推断他希望人们不要指定左侧的类型(也许我误解了)。做到这一点的唯一方法是根本不授予对底层类型的访问权限(根据工厂)。他的主题标题非常具有误导性。
【解决方案3】:

如果问题是“如何强制只调用接口方法?”,那么答案可能是:“将其余方法设为私有”

【讨论】:

    猜你喜欢
    • 2013-09-18
    • 2014-01-16
    • 1970-01-01
    • 2015-08-17
    • 2013-01-10
    • 2016-12-09
    • 1970-01-01
    • 1970-01-01
    • 2015-05-13
    相关资源
    最近更新 更多