Oded yanıtı, derleme sorununu çözerek arabirimi karşılayan ToDerived yöntemini tanımlamanıza olanak tanır. Ancak, yorumda belirttiğim gibi, bunun en iyi uygulama olduğundan emin değilim.
İçinde bulunduğum temel sorun, normal olarak statik bir bağlamda bunun gibi dönüştürme yöntemlerinin gerekli olmasıdır. SalesUser örneğiniz yok; Birini istiyorsanız ve bir Kullanıcı var, bu nedenle yöntemi statik bağlamda (SalesUser.ToDerived(myUser)
) çağırırsınız ve bir SalesUser (yöntem daha uygun olarak FromUser() veya benzeri olarak adlandırılır) alırsınız. Arabirimde belirttiğiniz yöntem, bir Kullanıcı'yı SalesUser'a dönüştürmek için zaten bir SalesUser'a sahip olmanızı gerektirir. Önceden var olan bir SalesUser'a ihtiyaç duyacağınız düşünebildiğim tek durum bir "kısmi klon" için; Yöntemi çağırdığınız SalesUser içinden ve içinden geçen Kullanıcıdan bilgileri kullanarak yeni bir SalesUser örneği oluşturuyorsunuz. Diğer tüm durumlarda, bir SalesUser'a (söz konusu statik olması gereken dönüşümler) gerek duymazsınız veya bir Kullanıcıya (yeni bir örnek oluşturan bir "klon" veya "derin kopya" yöntemine ihtiyacınız yoktur. yöntemi çağırdığınız örnekle aynı veri). Ayrıca, sınıfınızın tüketicileri, bir Kullanıcıdan bir SalesUser'a dönüştürme işlemini gerçekleştirmek için ToDerived() yöntemini çağırmaları gerektiğini bilmelidirler. Normalde, bir C# programcı açık veya örtülü bir dönüşüm kullanılabilir olması beklenir:
:
public class SalesUser
{
public static explicit operator (User user)
{
//perform conversion of User to SalesUser
}
}
//the above operator permits the following:
mySalesUser = (SalesUser)myUser;
... YA, bir dönüşüm operatörü başarısız, tek bir kullanıcı kullanarak bir SalesUser inşa edebilmek için beklenir
public class SalesUser:IUser
{
public SalesUser(User user)
{
//initialize this instance using the User object
}
}
//the above allows you to do this:
mySalesUser = new SalesUser(myUser);
//and it also allows the definition of a method like this,
//which requires the generic to be an IUser and also requires a constructor with a User
public void DoSomethingWithIUser<T>(User myUser) where T:IUser, new(User)
{
//...which would allow you to perform the "conversion" by creating a T:
var myT = new T(myUser);
}
Artık, statik üyeler arabirim tanımlarını karşılamıyor ve arabirimler statik üyeleri veya yapıcı imzalarını tanımlayamıyor. Bu bana, IUser arabiriminin dönüştürme yöntemini tanımlamaya çalışmaması gerektiğini söyler; bunun yerine, bir tür bir IUser'e gereksinim duyan yöntemler basitçe bunu belirleyebilir ve kullanıcı, kendi kendine dönüşebileceğini bilmesi gereken uygulama olmadan gerekli bir uygulamayı sağlayabilir.
[Buradan] (http://blogs.msdn.com/b/ericlippert/archive/2011/02/03/curiouser-and-curiouser.aspx), Eric'in bu soruyla ilgili bir blogun bağlantısıdır. Bu, aşağıdaki cevaba çok benzeyen bir örneği ve bu tasarım mekanizmasını kullanmanın tuzaklarını da içerir. – Servy