تجاوز الطريقة العامة في الفئة الفرعية بطريقة تقيد الوصول العام مع السماح بالوصول من فئة الوالدين؟

StackOverflow https://stackoverflow.com/questions/1977027

سؤال

لدي فئة تجميع عامة ، مع مجموعة متنوعة من أساليب getter العامة.

للحصول على عنصر واحد من المجموعة ، يمكنك الاتصال GET (). هناك أيضًا العديد من الطرق التي تُرجع عناصر متعددة: getMany () ، getRange () ، getall () ، find () ، findall () ، Query () ، Queryany () ، إلخ.

داخليًا ، كل هذه الطرق التي تُرجع عناصر متعددة تحتوي على حلقة تحصل عليها () مرارا وتكرارا ، لأنها تجمع العناصر الفردية للعودة.

مثال مبسط:

public function get($key){
    return $this->collection[$key];
}

public function getMany($keys){

    $many = array();

    foreach ($keys as $key){
        $many[] = $this->get($key);
    }

    return $many;
}

تنشأ المشكلة عندما أرغب في تمديد المجموعة بطريقة لا أريد أن يتمكن العميل من الوصول إلى عنصر واحد من المجموعة. في الأساس ، أريد عدم السماح بالوصول إلى طريقة GET ().

لا يمكنني جعل الحصول على () وظيفة خاصة أو محمية ، لأنها عامة في فئة الوالدين.

لا يمكنني أيضًا تجاوز GET () بطريقة تجعلها غير وظيفية (أي تجاوزها مع عودة فقط ، أو رمي استثناء) ، لأن جميع الأساليب الأخرى تعتمد على GET () ، وأريدهم ذلك تبقى وظيفية.

أعلم أنه يمكنني فقط تجاوز جميع الأساليب التي تعتمد على الحصول على () للاعتماد على طريقة محمية جديدة (أي getOne ()) ، ولكن هذا من شأنه أن ينتهك المبادئ الجافة.

ما لا أريد أن أفعله:

class DataSet extends Collection{

    public function get(){
        throw new Exception('get() not implemented in DataSet');
    }

    protected function getOne($key){
        return parent::get($key);
    }    

    public function getMany($keys){

        $many = array();

        foreach ($keys as $key){
            $many[] = $this->getOne($key);
        }

        return $many;
     }
}

إذا فعلت ما سبق ، فيجب أن أتجاوز نصف دزينة من الطرق (بعضها معقد للغاية) ، ولم يختلف إلا عن طريقة فئة الأصل من خلال عدد قليل من الأحرف.

إذن ... ما هي الخيارات الأخرى التي لدي؟ هل هناك وسائل مختلفة لنفس النهاية ...؟

هل كانت مفيدة؟

المحلول

ما يمكنك فعله هو جعل طريقة محمية تقول _get وهذا يمكن أن يكون ما تسميه جميع الأساليب داخليًا. يمكنك بعد ذلك فضح أ get الطريقة في جميع الفئات التي تحتاج إلى الوصول واتصل بها فقط _get.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top