Принудительно вызывать объект через его интерфейс - PullRequest
0 голосов
/ 09 февраля 2010

Как я могу заставить объект вызываться только через его интерфейс? Это может быть достигнуто только через Access Modifier, но в C # не может сделать.

У меня есть:

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

У меня есть секция кода, подобная приведенной выше. Я помещаю его в библиотеку классов, после чего создаю сборку.

В веб-проекте некоторые программисты добавляют ссылку на эту сборку. Если они хотят вызвать класс Profile, они должны использовать интерфейс IProfile, как указано ниже:

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

Но некоторые неосторожные программисты этого не сделают. Они будут использовать ниже путь:

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

Ответы [ 3 ]

3 голосов
/ 09 февраля 2010

Это действительно просто. Используйте явную реализацию интерфейса:

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

GetName теперь можно вызывать только через ссылку на интерфейс.

2 голосов
/ 09 февраля 2010

Вы захотите использовать фабричный подход, например:

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 () { }
    }
}
0 голосов
/ 09 февраля 2010

Если вопрос задан как «Как вызвать только сопряженные методы?», То ответ может быть следующим: «Сделать остальные методы приватными»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...