SORU
17 EYLÜL 2008, ÇARŞAMBA


Neden alıcı-tek bir özelliği geçersiz kılmak ve bir pasör eklemek için imkansız mı?

Neden (ya da neden iyi olur) Microsoft izin vermemeyi seçti sanıyorsun:

    public abstract class BaseClass
    {
        public abstract int Bar { get;}
    }

    public class ConcreteClass : BaseClass
    {
        public override int Bar
        {
            get { return 0; }
            set {}
        }
    }

CEVAP
9 EYLÜL 2010, PERŞEMBE


Genelinde aynı sorun bugün rastladım ve bunu yapmak için çok geçerli bir sebebi var bence.

Önce sadece bir özelliği olması mutlaka salt okunur çevirmek olmadığını iddia etmek istiyorum. Ben yorumlamak olarak "bu interface/transformation name alabilirsiniz bu değer" anlamına gelmez Bazı uygulama arayüzü/soyut sınıf alışkanlık gereken kullanıcı/program için ayarlanmış bu değeri açıkça. Soyut sınıflar gerekli işlevselliği bir parçası uygulamak amacıyla hizmet vermektedir. Devralınan bir sınıf herhangi bir sözleşme ihlal etmeden bir pasör eklemek olamazdı neden hiçbir sebep göremiyorum.

Aşağıdaki bugün istediğim basitleştirilmiş bir örnektir. Sadece bunun önüne geçmek için soyut sınıf arkadaşım ayarlayıcı eklemek zorunda kaldım. Bu nedenle ekleme ayarlayıcı ve ekliyor ki, bir SetProp yöntemi bir özel uygulama arayüzü kullanılan DataContract/DataMember için seri hale getirme Prop, yapılmış olurdu gereksiz yere karmaşık olsaydı eklemek başka bir özelliği sadece amacına uygun hale getirme.

interface ITest
{
    // Other stuff
    string Prop { get; }
}

// Implements other stuff
abstract class ATest : ITest
{
    abstract public string Prop { get; }
}

// This implementation of ITest needs the user to set the value of Prop
class BTest : ATest
{
    string foo = "BTest";
    public override string Prop
    {
        get { return foo; }
        set { foo = value; } // Not allowed. 'BTest.Prop.set': cannot override because 'ATest.Prop' does not have an overridable set accessor
    }
}

// This implementation of ITest generates the value for Prop itself
class CTest : ATest
{
    string foo = "CTest";
    public override string Prop
    {
        get { return foo; }
        // set; // Not needed
    }
}

Biliyorum bu sadece bir "benim 2 sent" yazı, ama ben hissediyorum orijinal poster ve mantığa oturtmaya çalışıyorum, bu iyi bir şey gibi görünüyor bana garip, özellikle dikkate alınarak, aynı kısıtlamalar yok uyguladığınızda devralmasını doğrudan bir arayüz.

Ayrıca denince kullanarak yeni yerine geçersiz geçerli değildir burada, o sadece işe yaramaz ve hatta eğer o yaptı değil mi. sen neden istedim, yani sanal bir alıcı olarak tanımlanan arabirimi.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • george sarintzotis

    george sarin

    2 Aralık 2007
  • grickle

    grickle

    22 AĞUSTOS 2006
  • RyanXLT

    RyanXLT

    22 Ocak 2011