2016-04-05 35 views
1

kodunu bakınız hiyerarşiler. Genel fikir oldukça basittir, hiyerarşinin her bir sınıfı, ayna hiyerarşisinin karşı sınıfının bir örneğini üretmek için fabrika yöntemine sahiptir. Kök sınıfın veya türev sınıfının bir örneğini alıyorum ve karşı sınıf örneğini veya türevini (kök eşdeğer sınıfı olarak) döndürmesi gerekiyor. Bunun yerine uygulayabileceğim herhangi bir fikir veya tasarım modeli?Uygulanması

+2

[codereview] (http://codereview.stackexchange.com/)? –

+0

@ S.Akbari Soruyu codereview'e nasıl taşıyabilirim? –

+0

Sadece giriş yapın ve soru gönderin. –

cevap

1

budur. Tüm yatlar kaldırıldı. Ama bu biraz verbose.

class X 
{ 
    public string x; 
} 

class Y : X 
{ 
    public string y; 
} 

class A 
{ 
    string a; 
    protected void setX(X x) 
    { 
    x.x = a; 
    } 
    public virtual X createX() 
    { 
    var x = new X(); 
    setX(x); 
    return x; 
    } 
} 

class B : A 
{ 
    string b; 
    protected void setY(Y y) 
    { 
    base.setX(y); 
    y.y = b; 
    } 
    public override X createX() 
    { 
    var y = new Y(); 
    setY(y); 
    return y; 
    } 
} 

... 
var c = new B(); 
var z = c.createX(); 
+0

Güzel bitti, ancak bunu yapmanın çocuk sınıfınıza bir çok yöntemi kattığını, bunun bir diğerini geçersiz kılıp kılmayacağını unutmayın. 42 set işleviyle [set ..] ve intelliSense pop-up'ınızı yazmayı hayal edin, ardından doğru olanı seçmeniz gerekiyor. – rocketspacer

+0

Kabul ediyorum, bu çok ayrıntılı. Daha iyi bir çözüm bulamıyorum. –

0

İstediğiniz bu olabilir mi?

class BaseProduct 
{ 
    public string x; 
} 

class ChildProduct : BaseProduct 
{ 
    public string y; 
} 

class BaseFactory 
{ 
    string a; 
    public virtual BaseProduct buildProduct(BaseProduct product = null) 
    { 
     if (product == null) 
      product = new BaseProduct(); 

     product.x = a; 
     return product; 
    } 
} 

class ChildFactory : BaseFactory 
{ 
    string b; 
    public override BaseProduct buildProduct(BaseProduct product = null) 
    { 
     if (product == null) 
      product = new ChildProduct(); 
     //else if (!(product is ChildProduct)) 
     // return null or throw exception 

     ((ChildProduct)product).y = b; 
     return base.buildProduct(product); //build BaseProduct.x 
    } 
} 

... 
var cFactory = new ChildFactory(); 
var cProduct = c.buildProduct(); //create a ChildProduct with x=a, y=b 

buildProduct kendine ait yeni bir ürünü oluşturmak için istenen ya da bazı türetilmiş-fabrika sadece

Bazı korunma mekanizması sağlamalıdır onun kendi part inşa etmek istemeyi olup olmadığını belirlemek ürününün, ChildFactory.buildÜrün içinde ChildProduct'dan türetilmiş bir sınıf olup olmadığını kontrol etmek gibi. Yani böyle bir şey geçirerek kullanıcıyı kaçınmak gerekir: ben erdi ne
childFactory.buildProduct(new BaseProduct()); //yak

+0

Eh, bu ikinci Yak ile ilgilenir, yine de downcast yapmaktan nefret ediyorum. Ben her iki yaksıdan kaçınmak için farklı bir çözüm buluyorum, ancak birazcık hafiftir. –