Birçok arabirimi uygulayan oldukça büyük bir nesneyi uygulamaya çalışıyorum. Bu arayüzlerden bazıları saf sanal. Elmas mirasta bir sorunum olabilir. Visual Studio, C4250 ('class1' : inherits 'class2::member' via dominance)
uyarısını bildiriyor. Öncelikle bu sınıflar olması gerektiği gibi miras alınır. Aşağıdaki, bu soruna neden olan kısmi sınıf tasarımdır.C++ Baskınlık uyarısı yoluyla miras alın
A B C
\ /\ /
\ / \ /
AB BC
| |
| BC2
| |
\ D: Implementation of B, C, BC, BC2
\ /
Big
Bu ağacın yalnızca D'sinde sanal yöntemler uygulanır, söz konusu yöntemin başka bir tanımı yoktur. Ve tüm B sanal yöntemleri uyarılarda listelenir. Önemliyse, D tam bir sınıftır.
Bunu, Boost serileştirme ile yapıldığını okudum ve uyarıyı göz ardı etmek güvenlidir.
Bu yöntem geçerli olmaya çalışıyorum mı? Bu uyarıyı dikkate almak güvenli mi?
Not 1: Bu, Visual Studio Compiler warning C4250 ('class1' : inherits 'class2::member' via dominance) kopyası değil, orada önerilen çözümü denedim.
Not 2: Ayrıca sınıf şemasını gönderebilirim ama bundan biraz daha karmaşık.
DÜZENLEME:
warning C4250: 'gge::resource::ImageResource' : inherits
'gge::graphics::ImageTexture::gge::graphics::ImageTexture::drawin'
via dominance
gge::resource::ImageResource
çizimde büyük olduğu, gge::graphics::ImageTexture
D drawin ı uyarı olsun altı yöntemlerden biri aşağıdaki gibidir: Tam uyarıdır.
Birçok arabirim uygulamak, sınıfınızın çok fazla sorumluluğu olabileceğinin bir işaretidir. Bunu birkaç küçük sınıfa geri almayı düşünün. – hammar
@hammar: Denedim ama sorun sınıfla ilgili değil, Big sadece bir görüntü ancak birçok farklı grafik tipini destekleyen birçok arayüz var. Belirli bir arabirimin hizmetlerini gerektiren işlevler, ihtiyaçlarını karşılayan en küçük arabirimi kullanmalıdır. Bir örnek olarak, bu özellikleri kullanarak, bir parçacık sistemini fare işaretçisi olarak değiştirebilirim. Kısacası daha küçük sınıflara giremedim. –
Alt sınıflamaya alternatif olarak Dekorasyon desenini (http://en.wikipedia.org/wiki/Decorator_pattern) göz önünde bulundurun. –