SORU
7 ŞUBAT 2011, PAZARTESİ


Neden C# 4 isteğe bağlı parametreler arayüzü üzerinde tanımlı uygulama sınıfı zorunlu değil mi?

Bir arabirim üzerinde isteğe bağlı olarak bir parametre belirtirseniz C isteğe bağlı parametreler# 4 Bu parametre, herhangi bir uygulama sınıfı isteğe bağlı yapmak zorunda olmadığını fark ettim:

public interface MyInterface
{
    void TestMethod(bool flag=false);
}

public class MyClass : MyInterface
{
    public void TestMethod(bool flag)
    {
        Console.WriteLine(flag);
    }
}

ve bu nedenle:

var obj = new MyClass();        
obj.TestMethod(); // compiler error

var obj2 = new MyClass() as MyInterface;
obj2.TestMethod(); // prints false

Herkes isteğe bağlı parametreler bu şekilde çalışmak üzere tasarlanmıştır neden biliyor mu?

Bir yandan sanırım yeteneği geçersiz kılmak için herhangi bir varsayılan değeri belirtilen arabirimler faydalı ama dürüst olmak gerekirse emin değilim, eğer sen bile olması mümkün belirtmek için varsayılan değerler arabirim gereken bir uygulama kararı.

Öte yandan, bu her zaman beton sınıf ve arayüz değiştirerek kullanabilirsiniz. yani kesin. Bu tabii ki, olmayacak bir sorun olursa varsayılan değer belirtilen uygulama, ama eğer sizin açıklamanızı beton sınıfı arabirim (kullanarak bazı IOC çerçeve enjekte beton sınıfı için örnek) o zaman gerçekten bir anlamı yok olan varsayılan değer olarak arayanın olması her zaman bulunur zaten.

CEVAP
7 ŞUBAT 2011, PAZARTESİ


GÜNCELLEME: This question was the subject of my blog on May 12th 2011. Thanks for the great question!

Sizin anlattığınız gibi bir arayüzü var, ve yüz sınıflar bunu uygulamak varsayalım. Sonra arabirimin yöntem isteğe bağlı bir parametre bir karar verdi. Yapılacak en doğru şey derleyici geliştirici arayüzü yöntemi her uygulama bulmak için zorlamak için olduğunu düşündüren, ve isteğe bağlı parametre " iyi misin?

Bunu yaptık diyelim. Şimdi geliştirici kaynak uygulaması için kod yoktu varsayalım:


// in metadata:
public class B 
{ 
    public void TestMethod(bool b) {}
}

// in source code
interface MyInterface 
{ 
    void TestMethod(bool b = false); 
}
class D : B, MyInterface {}
// Legal because D's base class has a public method 
// that implements the interface method

Nasıl yazar bu işi yapmak gerekiyor? Dünyada telefonda B Yazarı arayıp onları bire bir rica için gerekli yöntemi isteğe bağlı bir parametre var kılan B yeni bir sürüm?

O uçmak için gitmiyor. Ne olursaikiinsanlar B Yazarı çağırmak ve onlardan biri varsayılan gerçek olmak istiyor ve bunlardan biri yanlış olmak istiyor? Eğer B Yazarı sadece birlikte oynamak için reddetti?

Belki de bu durumda söylemek gerekli olacaktır:

class D : B, MyInterface 
{
    public new void TestMethod(bool b = false)
    {
        base.TestMethod(b);
    }
}

Önerilen özelliği temsilcisi güce karşılık gelen bir artış ile programcı için rahatsızlık bir sürü eklemek gibi görünüyor. Kullanıcı için artan maliyet haklı bu özelliği zorlayıcı yararı nedir?

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Kyler Briskey

    Kyler Briske

    20 ŞUBAT 2011
  • Ordetta Price

    Ordetta Pric

    12 EYLÜL 2011
  • Palmundo Ec

    Palmundo Ec

    11 HAZİRAN 2009