aşağıdaki olabilir doğrudur OCP'yi başarılması için bir yöntem:
abstract public class Mammal
{
public abstract void MakeSound();
public abstract bool Is(MammalTypes mammalType);
}
:
Memeli her somut alt türü zorlamak için soyut bir yöntem Is
tanımlayın enum belirli bir değeri için uygun olup olmadığını belirlemek için Bu yapılırken
class Cat : Mammal
{
// other specific members
public override bool Is(MammalTypes mammalType)
{
return mammalType == MammalTypes.Cat;
}
}
class Dog : Mammal
{
// other specific members
public override bool Is(MammalTypes mammalType)
{
return mammalType == MammalTypes.Dog;
}
}
, artık MammalF oluşturabilirsiniz: gibi alt sınıflar İş'in
uygulamaları olmazdı
public class MammalFactory
{
private readonly IEnumerable<Type> _mammalTypes;
public MammalFactory()
{
var currentAssembly = Assembly.GetExecutingAssembly();
_mammalTypes = currentAssembly.GetTypes()
.Where(t => typeof(Mammal).IsAssignableFrom(t) && !t.IsAbstract);
}
public Mammal Create(MammalTypes mammalType)
{
return _mammalTypes
.Select(type => CreateSpecific(type, mammalType))
.First(mammal => mammal != null);
}
public Mammal CreateSpecific(Type type, MammalTypes mammalEnumType)
{
var mammalInstance = (Mammal)Activator.CreateInstance(type);
return mammalInstance.Is(mammalEnumType) ? mammalInstance : null;
}
}
nihai kullanım aşağıdaki gibi görünecektir:
var mammalFactory = new MammalFactory();
var guessWhatMammal = mammalFactory.Create(MammalTypes.Cat);
bir eşleşme bulursa mevcut sınıflar ve üzerinden bir memeli sıralama değeri taramaları verildiğinde, bu sınıfta bir örneğini döndürür abrika sınıf
Bu, OCP'ye tam olarak uygundur. Uygulama için otomatik olarak kablolu ve kullanıma hazır olması için sadece yeni bir Mammal sınıfı oluşturulmalıdır.
bu yaklaşımla bazı sorunlar vardır (gerek enum kendisi hariç, uygulamada başka bir şey değiştirmek için):
- sadece memeli türleri için şu anda yürütülen montaj tarar
- sahip olduğu Memeli o tip bu konular ele alınabilir iken
uygun olup olmadığını test etmek için gereken her zaman bir örneğini oluşturmak için, hala bırakılır: karmaşıklığı. biz kod miktarı otomatik kablolama
ben sonuca düşünüyorum projeye yeni insanlar için kafa karıştırıcı olabilir
gerekli iki katına çıkardık
- çünkü:
Bu
karmaşıktır şudur: tasarım kalıpları katı kural değildir. Belirli bir tasarıma uymak için bir şey yapmaya değmez. Bunun yerine, pragmatik olmalı ve desen uyumu ile kullanışlılık/basitlik/okunabilirlik arasında mükemmel bir denge bulmalıyız. Bu, çözmeyi denediğimiz soruna büyük ölçüde bağlıdır ve birçok durumda, soruda sunduğunuz switch
beyanı olabilir.
** NOT ** Nesne Yönelimli. Temel sınıf, türetilmiş sınıfların farkında olmamalıdır. – gdoron
Yaptıklarınızı görselleştirmek zor. Lütfen sorunuza yazdığınız kodu ekleyin. – Abbas