Yuan Yijun (bbbush) wrote,
Yuan Yijun
bbbush

c# 怎么这么奇怪的

问题描述:一个用来描述文件的类,文件的属性是文件名,文件的方法是备份。还有一个静态方法是取已备份的最后一个文件,对这个文件不做备份。

有两批不同的文件要处理,所以要基于上面的情况,做两个类。

想定义一个只有 get 方法的 property,好让两个类的代码看起来"像一些",可是如果是 interface 就必须是
public,如果是基类就必须有个函数体。

还有一个方法,也是只要 private 就好了,可是就是不能放 interface 里头。其实是想搞一个单例,可是 interface
不支持 static,不支持就算了。

据说可以用 attribute 来做么

怎么办呢


update:
理解错了的事情: CurrentFile 和 LatestFile 对于 listfile 来讲是 singleton,但是对于 advfile 就不是,每个 advfile 有自己的最新的文件和存档。

为了使用一致的接口,还是应用 MyFile 基类处理 CurrentFile (存档),用 IArchivable 接口区分 LatestFile 的方法。不在基类里使用任何 static,唯一使用 static 的地方是 listfile 的 LatestListFile (隐藏掉构造函数)。

在 vim 中编译的命令是 :!mcs %




abstract class MyFile: System.IDisposable
{
	public MyFile CurrentFile{
		get{
			if(m_current == null)
			{
				LoadCurrentFile();
			}
			return m_current;
		}
	}

	public virtual void Dispose()
	{
		// do nothing
	}

	protected abstract void LoadCurrentFile();

	// TODO: override native compare functions
	public bool EqualTo(MyFile file)
	{
		return TestEqual(file);
	}

	protected abstract bool TestEqual(MyFile file);

	protected MyFile m_current;
};

interface IArchivable
{
	void RotateArchive();
}

class ListFile: MyFile, IArchivable
{
	public static ListFile LatestListFile
	{
		get{
			if(m_latest == null)
			{
				m_latest = new ListFile();
			}
			return m_latest;
		}
	}

	static ListFile m_latest;

	ListFile(){}

	protected override void LoadCurrentFile()
	{
		m_current = this;
	}

	protected override bool TestEqual(MyFile file)
	{
		using(file as ListFile)
		{
			// do nothing
			return false;
		}
	}

	public void RotateArchive()
	{
		// do nothing
	}
};

class ADVFile: MyFile, IArchivable
{
	protected override void LoadCurrentFile()
	{
		m_current = this;
	}

	protected override bool TestEqual(MyFile file)
	{
		// TODO: move this to base and use reflection to get this.Type
		using(file as ListFile)
		{
			// do nothing
			return false;
		}
	}

	public void RotateArchive()
	{
		// do nothing
	}
};

class EntryClass
{
	public static void Main()
	{
		ListFile f1 = ListFile.LatestListFile;

		MyFile f2 = f1.CurrentFile;
		if(!f2.EqualTo((MyFile)f1))
		{
			f1.RotateArchive();
		}

		ADVFile f3 = new ADVFile();
		MyFile f4 = f3.CurrentFile;
		if(!f4.EqualTo((MyFile)f3))
		{
			f3.RotateArchive();
		}

	}
}
Tags: 工作
Subscribe

  • 2020

    Last time I wrote a review was in 2018, about 2017. Or maybe I wrote something elsewhere, maybe on Twitter? It was hard to write something freely…

  • Feedback letter to Peoples Gas[1]

    Credit report dispute. To whom it may concern: I called at around 5pm, and the receptionist cannot figure it out why I had a "late…

  • 循序渐进

    ZR 说,你教小宝滑雪,一定要让他先体会到乐趣,不然他不肯学的。于是他教了小宝很久,果然教会了,小宝玩得特开心。 DL 说,你跑步,一开始不要跑那么快,太累。保持自己的节奏,能一边跑一边说话是最好。跑得太累,以后就不愿意来跑了。 CC…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 1 comment