внутренний член в интерфейсе - PullRequest
33 голосов
/ 15 декабря 2008

У меня есть список объектов, реализующих интерфейс, и список этого интерфейса:

public interface IAM
{
    int ID { get; set; }
    void Save();
}

public class concreteIAM : IAM
{
     public int ID { get; set; }
     internal void Save(){
     //save the object
     }

    //other staff for this particular class
}

public class MyList : List<IAM>
{
    public void Save()
    {
        foreach (IAM iam in this)
        {
            iam.Save();
        }
    }

    //other staff for this particular class
}

Предыдущий код не компилируется, потому что компилятор требует, чтобы все члены интерфейса были общедоступными.

internal void Save(){

Но я не хочу разрешать извне моей DLL сохранять ConcreteIAM, его нужно сохранять только через MyList.

Есть ли способ сделать это?

Обновление # 1 : Привет всем, спасибо за ответы на данный момент, но ни один из них не является именно тем, что мне нужно:

Интерфейс должен быть общедоступным, потому что это подпись, которую будет использовать клиент извне dll, наряду с ID и другими свойствами, которые я не удосужился написать в примере, чтобы упростить его.

Эндрю, я не думаю, что решение состоит в том, чтобы создать фабрику для создания другого объекта, который будет содержать IAM членов + Сохранить. Я все еще думаю ... Есть еще идеи?

Ответы [ 12 ]

0 голосов
/ 11 января 2012

Я размышлял над тем же вопросом здесь, и наткнулся на этот вопрос ...

Когда я думал об этом, я понял, что мне не нужен внутренний метод в интерфейсе.

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

В вашем примере:

    public interface IAM
    {
            int ID { get; set; }
    }

    public class concreteIAM : IAM
    {
             public int ID{get;set;}
             internal void Save(){
             //save the object
             }

            //other staff for this particular class
    }

    public class MyList : List<IAM>
    {
            public void Save()
            {
                    foreach (concreteIAM iam in this)
                    {
                            iam.Save();
                    }
            }
            //other staff for this particular class
    }
0 голосов
/ 15 декабря 2008

Go с двумя интерфейсами:

public interface IAM
{
        int ID { get; set; }
}


internal interface IAMSavable
{
        void Save();
}

public class concreteIAM : IAM, IAMSavable
{
         public int ID{get;set;}
         public void IAMSavable.Save(){
         //save the object
         }

        //other staff for this particular class
}

public class MyList : List<IAM>
{
        public void Save()
        {
                foreach (IAM iam in this)
                {
                        ((IAMSavable)iam).Save();
                }
        }

        //other staff for this particular class
}

Реализация Save () должна быть явной, чтобы клиенты не вызывали ее.

...