은의 간단한 데코레이터 예를 들어 보자?데코레이터 패턴은 슈퍼 안티 패턴
call super는 파생 된 하위 클래스에서 사용자가 메서드를 재정의하고 특정 지점에서 재정의 된 함수 자체를 호출해야한다는 특정 클래스의 디자인 패턴입니다.
여기에 little different implementation 디자인에 차이가 있습니까?
은의 간단한 데코레이터 예를 들어 보자?데코레이터 패턴은 슈퍼 안티 패턴
call super는 파생 된 하위 클래스에서 사용자가 메서드를 재정의하고 특정 지점에서 재정의 된 함수 자체를 호출해야한다는 특정 클래스의 디자인 패턴입니다.
여기에 little different implementation 디자인에 차이가 있습니까?
이것은 최고급 통화가 아닙니다. 재정의 된 버전이 아닌 다른 IStuff
인스턴스의 Info
메서드를 호출합니다.
전화 슈퍼 버전 :
struct IStuff
{
virtual void Info() = 0;
virtual ~IStuff() { }
};
class Stuff : public IStuff
{
public:
void Info() { std::cout << "Basic stuff"; }
};
class StuffDecorator : public IStuff
{
IStuff* decorated_;
public:
StuffDecorator(IStuff* decoratedStuff) :
decorated_(decoratedStuff) {}
~StuffDecorator() { delete decorated_; }
void Info()
{
decorated_->Info();
}
};
class Shiny : public StuffDecorator
{
public:
Shiny(IStuff* stuff) : StuffDecorator(stuff) { }
void Info()
{
StuffDecorator::Info();
std::cout << "->Shiny";
}
};
: 실내 장식의
struct IStuff {
// If you override this, you MUST call the base class version <-- call super
virtual void Info()
{
// a default implementation.
std::cout << "Super call ";
}
virtual ~IStuff() { }
};
class Shiny : public IStuff {
public:
void Info() {
IStuff::Info(); // don't forget to call base implementation.
std::cout << "->Shiny";
}
};
일부 구현은 데코레이터 기본 클래스에 슈퍼 전화를하고있다, 즉 장식 된 참조를 누르고 전화를 관리 할 책임이있다 수퍼 전화를 피하기 위해 Template Method과
class StuffDecorator : public IStuff
{
IStuff* decorated_;
public:
StuffDecorator(IStuff* decoratedStuff) :
decorated_(decoratedStuff) {}
~StuffDecorator() { delete decorated_; }
void Info()
{
decorated_->Info();
DoInfo();
}
private:
// Template method
virtual void DoInfo() = 0;
};
class Shiny : public StuffDecorator
{
public:
Shiny(IStuff* stuff) : StuffDecorator(stuff) { }
private:
void DoInfo()
{
std::cout << "->Shiny";
}
};
알겠습니다. 또한 [다른 구현] (http://www.vincehuston.org/dp/decorator.html) [내 여기에] (http://stackoverflow.com/questions/2988066/decorator-pattern- in-c) 당신의 전화 슈퍼 버전과 똑같이 보입니다 - 아니면 뭔가 간과 했나요? –
@ JanTuroň 네 말이 맞아. 나는 내 대답을 편집하고 슈퍼 콜이없는 soultion을 제공했다. – hansmaad
아니요, 수퍼 클래스를 호출하지 않으므로 super를 호출하지 않습니다. 포함 된 객체를 호출하고 있습니다. –