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

  • cosmicrocketman

    cosmicrocket

    17 NİSAN 2006
  • incognitotraveler

    incognitotra

    27 Mayıs 2010
  • Strata1000

    Strata1000

    28 EYLÜL 2009