Soru Bir arabirimde isteğe bağlı parametreleri bildirmek için herhangi bir neden var mı?


Bir arabirim yönteminde isteğe bağlı parametreleri bildirebilirsiniz, ancak parametreleri uygulamak isteğe bağlı olarak isteğe bağlı olarak bildirmek için gerekli değildir. Eric Lippert açıkladı. Tersine, bir uygulama sınıfında isteğe bağlı olarak bir parametre bildirebilir, ancak arabirimde değil.

Yani bir arayüzde isteğe bağlı parametreleri bildirmek için herhangi bir sebep var mı? Eğer değilse, neden izin verilir?

Örnekler:

public interface IService1
{
    void MyMethod(string text, bool flag = false);
}

public class MyService1a : IService1
{
    public void MyMethod(string text, bool flag) {}
}

public class MyService1b : IService1
{
    public void MyMethod(string text, bool flag = true) { }
}

public interface IService2
{
    void MyMethod(string text, bool flag);
}

public class MyService2b : IService2
{
    public void MyMethod(string text, bool flag = false) { }
}

20
2017-07-19 19:13


Menşei


Çifte göründüğü gibi: stackoverflow.com/questions/4922714/... - Tigran


Cevaplar:


Örnek:

public interface IService1
{
    void MyMethod(string text, bool flag = true);
}

public class MyService1a : IService1
{
    public void MyMethod(string text, bool flag) { }
}

Kullanımı:

IService1 ser = new MyService1a();
ser.MyMethod("A");

2. parametre geçti MyService1a olacak truearayüzde varsayılan parametre olarak.


22
2017-07-19 19:21





Bunun nedeni, arayanlar için derleme zamanı türünün yalnızca arayüz olması durumunda arayanların kullanımını kolaylaştırmaktır:

public void Foo(IService1 service)
{
    service.MyMethod("Text"); // Calls MyMethod("Text", false)
}

Bir arayan için sadece somut tip yerine bir şey uygular arayüz hakkında bilmek oldukça yaygın - Eğer İsteğe bağlı parametrelerin iyi bir fikir olduğuna inandığınız (tartışmalı), bunları somut tiplerdeki arayüzlerde kullanmak kadar mantıklı.


20
2017-07-19 19:18





Biri bir yöntemle bir arayüz tasarlıyorsa Foo bu parametre alır Barve çağrıların% 99'u (ancak% 100'ü değil) Foo sıfır geçmek Barbiri de olmalı:

  1. `Bar` parametresini içeren ve içermeyen arabirim yöntemi aşırı yüklerine dahil edin, böylece bu arabirimin her uygulamasının ekstra bir yöntem içermesi gerekir, ancak arayanların belirtilmesi gerekenleri serbest bırakır.
  2. Yalnızca "Bar" içeren bir yöntem dahil edin, uygulayıcıları ekstra yöntemin maliyetinden tasarruf edin, ancak her arama sitesine dahil edilecek ek bir parametreyi gerektirir.
  3. Parametreyi arayüzde isteğe bağlı olarak tanımlayın, böylece hem uygulayıcılar hem de tüketiciler için işleri daha uygun hale getirin.

Seçenek # 3 çalışılabilir olduğunda bana en uygun gibi görünüyor.


3
2017-10-19 23:29





Arayüzün onları istediği şekilde beyan edebilmesi için kullanışlıdır, böylece arayüzü yaparken istediğiniz esnekliği elde edersiniz. Diğer bir deyişle, türetilmiş bir sınıftaki bir uygulayıcı, parametreyi isteğe bağlı yapabilir, istediği gibi yapabilir. İsteğe bağlı değilse, türetilmiş sınıflar buna sahip olmalıdır.

Yukarıdaki örneğiniz sadece şunu göstermektedir: türetilmiş sınıflardaki esneklik.


1
2017-07-19 19:18





Arabirim tasarımcısının varsayılan parametreler varsayımı, uygulayıcının tasarımından farklı olabilir.

Varsayılan parametreler, derleyici tarafından basitçe genişletilir ve parametreler gerçek varsayılan değerler ile değiştirilir.

Bir arabirimin örneği olan bir nesne üzerinde yöntem çağırdığınızda, derleyici arabirimde belirtilen varsayılan değerleri değiştirir.

Ve sınıfın bir örneği olan bir nesne üzerinde yöntem çağırdığınızda, derleyici sınıfta belirtilen varsayılan değerleri değiştirir.


0
2017-07-19 19:20