2013-04-06 40 views
1

我有下面的情况。有没有一种简单的方法来设计它,以便数据成员示例在ChildClass1的所有实例中共享,并且它的单独实例与所有ChildClass2实例共享?继承分支独有的共享数据成员?

abstract class BaseClass{ 
int sample = 0; 
} 

class ChildClass1: BaseClass{ 
} 

class ChildClass2: BaseClass{ 
} 

我希望能产生以下

ChildClass1 a = new ChildClass1(); 
ChildClass1 b = new ChildClass1(); 
ChildClass2 c = new ChildClass2(); 

a.sample = 10; 

//a.sample = 10, b.sample = 10, c.sample = 0 
+2

我的意思不是粗鲁,但我在这里闻到一些不好的设计。你能否详细说明*为什么*你希望这样做? – 2013-04-06 16:05:22

+0

你想'静态'(在VB.Net中'共享')?但我同意,这听起来像一个坏主意...... – Corak 2013-04-06 16:08:02

+0

@Corak,不 - 他想拥有一个基类成员('sample'),并根据继承基类的不同而表现出不同的行为。 。:/ – 2013-04-06 16:11:53

回答

0

正如我在我的评论说,我认为这是在你的设计中的固有缺陷,而是提供一个答案的缘故,你可以这样实现它:

abstract class BaseClass<TDERIVED> 
{ 
    private static Dictionary<Type, int> sampleDictionary_ = new Dictionary<Type, int>(); 

    public BaseClass() 
    { 
    } // eo ctor 


    public int Sample 
    { 
     get 
     { 
      return sampleDictionary_.ContainsKey(typeof(TDERIVED)) ? sampleDictionary_[typeof(TDERIVED)] : 0; 
     } 
     set 
     { 
      sampleDictionary_[typeof(TDERIVED)] = value; 
     } 
    } 
} 

class ChildClass1 : BaseClass<ChildClass1> 
{ 
} 

class ChildClass2 : BaseClass<ChildClass2> 
{ 
} 

这有额外的好处,如果添加任何其他子类,他们将获得他们自己的响应的版本。请注意,这是而不是线程安全的,所以如果您确实选择了此解决方案并希望在多线程环境中使用它,那么您可能需要放置一些线程安全代码。

2

也许这样做,你想要什么:

public abstract class BaseClass 
{ 
    public abstract int Sample { get; set; } 
} 

public class ChildClass1 : BaseClass 
{ 
    private static int mSample = 0; 
    public override int Sample 
    { 
     get { return mSample; } 
     set { mSample = value; } 
    } 
} 

public class ChildClass2 : BaseClass 
{ 
    private static int mSample = 0; 
    public override int Sample 
    { 
     get { return mSample; } 
     set { mSample = value; } 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var a = new ChildClass1(); 
     var b = new ChildClass1(); 
     var c = new ChildClass2(); 

     a.Sample = 10; 

     Console.WriteLine(a.Sample); // 10 
     Console.WriteLine(b.Sample); // 10 
     Console.WriteLine(c.Sample); // 0 
    } 
} 
0

你可能想看看进入singleton pattern

创建一个单独的类来保存共享数据。然后让所有三个类引用单例。