Свойства C#
public interface ZGet
{
int Z
{
get;
}
}
public interface ZSet
{
int Z
{
set;
}
}
public class ZZ : ZGet, ZSet
{
public int Z
{
get
{
return 0;
}
set
{
}
}
}
Компилиццо. Значит, можно =)
ЗЫ: Вот ты блин человек ленивый!
P.S. не надо необосновано обвинять человека в лени
public interface ZGet
{
int Z
{
get;
}
}
public interface ZSet : ZGet
{
new int Z
{
get;
set;
}
}
public class ZZ : ZSet
{
public int Z
{
get
{
return 0;
}
set
{
}
}
}
Все работает, я проверил.
P.S. не надо необосновано обвинять человека в лени=) Необоснованно? =)
ха-ха, я тоже видел, что компилятор предлагает слово new поставить, но вот получится совсем не то что хочется. Подумай или почитай почему (если ты такой неленивый).
ха-ха, я тоже видел, что компилятор предлагает слово new поставить, но вот получится совсем не то что хочется. Подумай или почитай почему (если ты такой неленивый).
Не понимаю. А что тебе хочется?
Такой код
ZZ z = new ZZ;
int a = 10;
ZSet zs = (ZSet)z;
zs.Z = a;
a = zs.Z;
ZGet zg = (ZGet)z;
a = zg.Z;
Прекрасно работает...
Или ты хочешь помимо наследования интерфейсов еще и имплементирующие их классы друг от друга наследовать?
На первый взгляд, этот new никаких серьезных side-эффектов в данном случае не дает.
P.S. (На досуге как-нибудь подумаю получше об этом).
На первый взгляд, этот new никаких серьезных side-эффектов в данном случае не дает.
Народ, вас чего-то глючит!
Этот new означает, что ZSet.Z.get не имеет _никакого_ отношения к ZGet.Z.get, то есть по этому методу нет полиморфизма. Как бы случайно имена совпали. Нафига тогда вообще наследование? Вот напишете вы
public interface ZGet
{
int Z
{
get;
}
}
public interface ZSet : ZGet
{
new int Z
{
get;
set;
}
}
public class ZZGet : ZGet
{
public int Z
{
get
{
return 0;
}
}
}
public class ZZSet : ZZGet, ZSet
{
new public int Z
{
set
{
}
get
{
return(1);
}
}
}
(Обращаю внимание, что снова пришлось new сказать!)
А потом
ZZSet x = new ZZSet;
ZZGet y = x;
System.Console.WriteLine(x.Z);
System.Console.WriteLine(y.Z);
И будете удивляться, что x.Z == 1, а y.Z все еще == 0. Клево отнаследовались!
Не путай интерфейсы и классы!
В случае наследующихся друг от друга интерфейсов полиморфизма вообще не может быть, потому что не может быть никогда, ИМХО! Потому что интерфейсы - это не классы! Я не понимаю, как можно говорить о полиморфизме применительно к чему-нибудь, в чем нет кода.
Так вот, а если ты хочешь наследоваться от класса, который уже имплементирует (хотя бы частично) интерфейс, который ты тоже типа имплементируешь, то тебе по любому придеццо заниматься разными извращениями, которые, по большому счету, не имеют никакого отношения к обсуждаемой теме. Конечно, в случае пропертей тебе будет немножко тяжелее это делать, чем если бы у тебя были бы функции.
Кстати, мне кажется, что то, что возникают подобные непонятности и недоразумения - это Мировой Порядок Вещей намекает нам что мы хуйню делаем, и что надо быть проще, а то сами же потом через полгода будем дуплить в прогу и не понимать, что у нас от чего отнаследовано. Именно поэтому я только что решил поэкспериментировать с виртуальными пропертями, а потом решил, что я, пожалуй, воздержусь.
ЗЫ: Не стоит воспринимать этот пост как наезд. А то че-тго задолбали воспринимать мои посты как наезды =)
А вообще так писАть, конечно, не стОит.
new в обоих случаях в точности одинакового смысла, оно означает "не переопределять (override) старый метод а завести новый, просто с таким же именем, случайно. Выдать этому методу отдельный слот в _vtable."
Так вот если этот пример переписать с пропертей на обычные методы, то new нигде писать не приходится, а надо писать override, и все нормально полиморфируется:
public interface ZGet
{
int Z_get;
}
public interface ZSet : ZGet
{
void Z_set(int z);
}
public class ZZGet : ZGet
{
public virtual int Z_get
{
return 0;
}
}
public class ZZSet : ZZGet, ZSet
{
public void Z_set(int z)
{
}
public override int Z_get
{
return 1;
}
}
class MainClass
{
[STAThread]
static void Main(string[] args)
{
ZZSet zzset = new ZZSet;
ZZGet zzget = zzset;
ZGet zget1 = zzset;
ZGet zget2 = zzget;
ZSet zset = zzset;
System.Console.WriteLine(zzset.Z_get;
System.Console.WriteLine(zzget.Z_get;
System.Console.WriteLine(zget1.Z_get;
System.Console.WriteLine(zget2.Z_get;
System.Console.WriteLine(zset.Z_get;
System.Console.ReadLine;
}
}
Output:
1
1
1
1
1
А в случае new, которое приходится писать при варианте с пропертями, многие из этох единиц останутся нулями. Вот.
Зацени так:
public class ZZGet : ZGet
{
public virtual int Z
{
get { return 0; }
}
}
public class ZZSet : ZZGet, ZSet
{
public override int Z
{
get {return 1;}
}
int ZSet.Z
{
get {return Z;}
set {}
}
}
=) =) =)
Таки тоже все единички в твоем мейне!
Ну да, все правильно, redirect пришлось написать... Вобщем автор треда много полезного из нашей дискуссии извлечет!
Оставить комментарий
6yrop
Разделить сетор и гетор на два интерфейсаpublic interface IA
{
int GetP;
}
public interface IB: IA
{
void SetP(int value);
}
через свойсва это сделать нельзя?