Açık Arabirim Uygulaması (C# Programlama Kılavuzu)
Bir sınıf aynı imzaya sahip bir üye içeren iki arabirim uygularsa, o üyeyi sınıfta uygulamak her iki arabirimin de bu üyeyi kendi uygulaması olarak kullanmasına neden olur. Aşağıdaki örnekte, aynı yöntemi çağırmak için Paint
yapılan tüm çağrılar. Bu ilk örnek türleri tanımlar:
public interface IControl
{
void Paint();
}
public interface ISurface
{
void Paint();
}
public class SampleClass : IControl, ISurface
{
// Both ISurface.Paint and IControl.Paint call this method.
public void Paint()
{
Console.WriteLine("Paint method in SampleClass");
}
}
Aşağıdaki örnek yöntemleri çağırır:
SampleClass sample = new SampleClass();
IControl control = sample;
ISurface surface = sample;
// The following lines all call the same method.
sample.Paint();
control.Paint();
surface.Paint();
// Output:
// Paint method in SampleClass
// Paint method in SampleClass
// Paint method in SampleClass
Ancak aynı uygulamanın her iki arabirim için de çağrılmasını istemeyebilirsiniz. Hangi arabirimin kullanıldığına bağlı olarak farklı bir uygulama çağırmak için, bir arabirim üyesini açıkça uygulayabilirsiniz. Açık arabirim uygulaması, yalnızca belirtilen arabirim aracılığıyla çağrılan bir sınıf üyesidir. Sınıf üyesini, arabirimin adı ve nokta ile ön ekini ekleyerek adlandırın. Örneğin:
public class SampleClass : IControl, ISurface
{
void IControl.Paint()
{
System.Console.WriteLine("IControl.Paint");
}
void ISurface.Paint()
{
System.Console.WriteLine("ISurface.Paint");
}
}
Sınıf üyesi IControl.Paint
yalnızca arabirimi aracılığıyla IControl
kullanılabilir ve ISurface.Paint
yalnızca aracılığıyla ISurface
kullanılabilir. Her iki yöntem uygulaması da ayrıdır ve ikisi de doğrudan sınıfında kullanılamaz. Örneğin:
SampleClass sample = new SampleClass();
IControl control = sample;
ISurface surface = sample;
// The following lines all call the same method.
//sample.Paint(); // Compiler error.
control.Paint(); // Calls IControl.Paint on SampleClass.
surface.Paint(); // Calls ISurface.Paint on SampleClass.
// Output:
// IControl.Paint
// ISurface.Paint
Açık uygulama, her iki arabirimin bir özellik ve yöntem gibi aynı adın farklı üyelerini bildirdiği durumları çözmek için de kullanılır. Her iki arabirimi de uygulamak için bir sınıfın derleyici hatasından kaçınmak için , P
veya yöntemi P
ya da her ikisi için açık uygulama kullanması gerekir. Örneğin:
interface ILeft
{
int P { get;}
}
interface IRight
{
int P();
}
class Middle : ILeft, IRight
{
public int P() { return 0; }
int ILeft.P { get { return 0; } }
}
Açık arabirim uygulamasının, içinde tanımlandığı türün bir üyesi olarak erişilebilir olmadığından erişim değiştiricisi yoktur. Bunun yerine, yalnızca arabirimin bir örneği aracılığıyla çağrıldığında erişilebilir. Açık arabirim uygulaması için bir erişim değiştirici belirtirseniz, derleyici hatası CS0106 alırsınız. Daha fazla bilgi için bkz interface
. (C# Başvurusu).
Bir arabirimde bildirilen üyeler için bir uygulama tanımlayabilirsiniz. Bir sınıf bir arabirimden yöntem uygulamasını devralırsa, bu yönteme yalnızca arabirim türü başvurusu aracılığıyla erişilebilir. Devralınan üye ortak arabirimin bir parçası olarak görünmez. Aşağıdaki örnek, arabirim yöntemi için varsayılan bir uygulamayı tanımlar:
public interface IControl
{
void Paint() => Console.WriteLine("Default Paint method");
}
public class SampleClass : IControl
{
// Paint() is inherited from IControl.
}
Aşağıdaki örnek varsayılan uygulamayı çağırır:
var sample = new SampleClass();
//sample.Paint();// "Paint" isn't accessible.
var control = sample as IControl;
control.Paint();
Arabirimi uygulayan IControl
herhangi bir sınıf, ortak bir yöntem veya açık arabirim uygulaması olarak varsayılan Paint
yöntemi geçersiz kılabilir.