2016-04-01 26 views
1

i genel olarak C# veya OOP yeniyim ve bir sonraki miras ile mümkün olup olmadığını merak ediyorum:gizle türetilmiş sınıf

i kurulum için bir iletişim bağlantısını istiyor ve udp veya seri haberleşme kullanmak isterler. Yani ben, .Open yöntemlerle soyut temel sınıf Linki 'tanımlamak .close, `s

Şimdi 4 yöntemleri, bu temel sınıfından .receive i 2 sınıfların LinkUdp' türetmek ve 'LinkSerial' ve geçersiz 'Link' sınıfına doğrudan bir nesne ile kod yazmak mümkün mü? Demek istediğim:

Link myLink = new Link ("10.0.0.1"); // derleyici şimdi kullanıyor LinkUdp sınıfını kullanıyor
Link myLink = new Link ("COM1"); // derleyici LinkSerial sınıfı

kullanmak bilir ya benim kod gibi adanmış yazmak zorunda yapın:

LinkUdp Bağlantım = new LinkUdp ("10.0.0.1"); Bu yeterince açık

Umut ... Teşekkür

düzenleme: i 2 farklı uygulamaları yazmak zorunda kalmadan bu yüzden bir alt sınıfa nesneyi geçirebilir 'Bağlantı' sınıfını kullanmak istiyorum : nedenle bu sonra bir sınıf

CommunicationHandler myComm = yeni CommunicationHandler (Bağlantım) vardır;

ve sonra bu işleyici bana udp veya seri kullanmak konusunda endişe zorunda değildir

...

+0

Sana Fabrika Desen http://www.dofactory.com anlaşılması için bu linki kullanınız uygulamak zorunda düşünüyorum/net/factory-method-design-pattern – rashfmnb

+0

Eğer 'Link' soyut bir sınıfsa, o zaman doğrudan onun bir örneğini oluşturamazsınız. 'yeni Link (...)' geçersiz. –

cevap

1

derleyici (sürece sadece değişken adına göre örneğini hangi tip seçmesine izin vermek yolu yoktur Sizin için doğru örneği oluşturmak için yansıma veya fabrika kullanın.

Bu olsa mümkündür ve miras yararlarından biri gösterilir:

Link myLink; 
myLink = new LinkUdp("10.0.0.1"); 
myLink = new LinkSerial("10.0.0.1"); 

olursa olsun ne şu, myLink ikisini de olabilir. Kullanılan tür, uygulamanızın olabildiğince genel olmasını sağlayan Link'dur.

+0

, yukarıdaki düzenlemede olduğu gibi: bu myLink'i başka bir yönteme aktarabilirim ve örneğin myLink.Open() işlevini çağırmak için herhangi bir sorun olmazdı. LinkUdp.Open() ve LinkSerial.Open() her ikisi de mevcut olduğu sürece? O zaman bu benim sorunumun cevabı olmalı.Teşekkürler – JakkeFire

+0

Evet, bunun için endişelenme. Parametreniz için "Link" seçeneğini kullanın. –

+0

Ve bu yöntemler, temel sınıfta, muhtemelen türetilmiş sınıflardaki bir uygulama ile "soyut" olarak tanımlanmalıdır. –

7

Sınıf için kurucu, yalnızca sınıfın tipini döndürebilir. Sen alternatif olarak (fabrika deseni) statik oluşturma işlevi olabilir:

Link myLink = Link.Create("10.0.0.1"); 

örn

public static Link Create(string something) 
{ 
    if (//determine that "something" is an IP address)) 
     return new LinkUdp(something); 
    else 
     return new LinkSerial(something); 

} 
İlgili konular